zoukankan      html  css  js  c++  java
  • 异常

    -----源自《马士兵java基础》

    今天看代码时,对java的异常throw和catch等很模糊,特意找了之前下载的马士兵基础视频来复习下。

    ctrl+t----查找继承树

    ctrl+o----查找方法

    alt+/-----快速单词

    ctrl+shift+/----多行注释

    ctrl+1-----创建对象时 new 对象;(代码补充)

    java运行过程中产生的异常:

    • java异常是java提供的用于处理程序错误的一种机制
    • 所谓的错误是指程序在运行过程中发生的一些异常事件
    • 设计良好的程序应该在异常发生时提供处理这些错误的方法
    • java程序在执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息提交给java运行时的系统,这个过程称为抛出(throw)异常。
    • 当java运行时系统接收到异常对象时,会寻找能处理这一异常代码并把当前异常对象交给它处理,这一过程称为捕获(catch)异常
    public class TestEx {
        public static void main(String[] args){
            int[] a = {1,2,3};
            System.out.println(a[1]);
        try {    
            System.out.println(2/0);
           } catch (ArithmeticException ae){
            System.out.println("系统出现问题,请及时与管理员进行联系");
            ae.printStackTrace();
            }
        }
    }

    异常的分类

    error:是系统内部异常,无法处理

    exception:可以处理

    runtimeexception:可以处理也可以不处理,但运行后会报错。

    2.Throwable

    Throwable类是所有异常或错误的超类,它有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception分为运行时异常(RuntimeException)和非运行时异常,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

    3.Error

    一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。

    5.运行时异常和非运行时异常

    (1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

    当出现RuntimeException的时候,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 
    出现运行时异常后,如果没有捕获处理这个异常(即没有catch),系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 
    如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。

     

    finally异常处理

     打开文件进行读取,无论是否成功都要进行关闭操作。

    import java.io.IOException;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    public class TestEx {
    public static void main(String[] args) {
            
            FileInputStream in = null;//定义文件
            
        try {
            in = new FileInputStream("myfile.txt");
            int b;
            b = in.read();
            while (b != -1) {
                System.out.print((char) b);
                b = in.read();
            }
        }  catch (FileNotFoundException e) {
            e.printStackTrace(); 
          
        } catch (IOException e) {
            System.out.println(e.getMessage());
             
          }finally {         //finally代码无论产不产生异常都执行
            try {
              in.close();       //关闭文件
          } catch (IOException e) {
              e.printStackTrace();
          }
        }
    }         
    }

     

    声明方法抛出异常

    方法f()和方法f2()都抛出异常给主函数处理,作为程序员,对抛出的异常一定要进行必要的处理。

    import java.io.IOException;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    public class TestEx {
    public static void main(String[] args) {
        try {
            new TestEx().f2();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
      }      
    void f() throws FileNotFoundException,IOException{
        FileInputStream in = new FileInputStream("myfile.txt");
        int b;
        b = in.read();
        while (b != -1){
            System.out.println((char) b);
            b = in.read();
        }        
      }
    void f2() throws IOException {
        f();
      }
    }

     关键字:throw,throws,try和catch的用法如下:
            1、throws出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型

      

    void f() throws FileNotFoundException,IOException{
        FileInputStream in = new FileInputStream("myfile.txt");
        int b;
        b = in.read();
        while (b != -1){
            System.out.println((char) b);
            b = in.read();
        }        
      }


            2、throw出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw,不处理就一直往上面抛。

      

        public void regist(User user) {
            //查询用户名是否存在
            String userName = user.getUserName();
            int count = userMapper.countUserName(userName);
            //如果不存在,就抛出异常映射
            if(count > 0){
                throw new UserNameAlreadyExistException(GlobalMessage.USER_NAME_ALREADY_EXISTS);
            }
            //保存
            userMapper.insert(user);
        }

    自定义的异常

    public class UserNameAlreadyExistException extends RuntimeException{
        private static final long serialVersionUID = 1L;
        //给父类赋值
        public UserNameAlreadyExistException(String message) {
            //调用父类构造方法进行赋值
            super(message);
            // TODO Auto-generated constructor stub
        }
        
    }

    可以通过Exception.getMesssage();获取异常信息


            3、try出现在方法体中,它自身是一个代码块,表示尝试执行代码块的语句。如果在执行过程中有某条语句抛出异常,那么代码块后面的语句将不被执行。
            4、catch出现在try代码块的后面,自身也是一个代码块,用于捕获异常try代码块中可能抛出的异常。catch关键字后面紧接着它能捕获的异常类型,所有异常类型的子类异常也能被捕获。

    因为追求卓越,成功在不经意间追上了你
  • 相关阅读:
    Redis 在 分布式项目中 的小应用--分布式锁 模拟session 分布式自增id
    自动生成swagger 前后端分离 对接文档
    利用IDEA 把maven工程中spring-boot的某个模块打成jar包
    利用SQL语句,把本地Excel文件批量导入mysql数据库,做测试数据使用
    Java常用API-String类
    网络编程模型及TCP、UDP编程设计
    计算机网络模型构架分析
    多线程程序的设计详解
    多进程、进程间通讯设计
    Linux 文件编程、时间编程基本函数
  • 原文地址:https://www.cnblogs.com/limingxian537423/p/6914805.html
Copyright © 2011-2022 走看看