Java异常体系结构及异常处理

Java异常处理的五个关键字及异常体系结构

异常是指在程序运行过程中所发生的不正常事件,异常会中断正在运行的程序,异常有的是因为人为错误引起,有的是程序错误引起的。

Java异常体系结构

所有异常类都属于Throwable类的子类,其中派生了两个子类:Error类和Exception类。

  1. Error类:仅靠程序本身无法恢复的严重错误。 (如果出现这种异常,应尽力使程序安全退出,所以在程序设计时,应该更关注Exception类
  2. Exception类:由Java应用程序抛出和处理的非严重性错误,比如所需文件找不到、网络连接不通、算术运算出错(如被零除)等。它的各种不同的子类分别对应不同类型的异常。

Exception类的常见异常类

Exception有两个子类,一个是RuntimeException,另一种是 非运行时异常,比如IOException。
运行时发生的异常RuntimeException是我们程序开发中需要重点处理的异常。
在程序运行时发生的异常,不要求程序必须对异常进行处理。常见的异常类有:

异常 说明
Exception 异常层次结构的根类
ArithmeticException 算术错误异常,如以零作为除数
ArrayIndexOutOfBoundsException 数组下标越界
NullpointerEXception 尝试访问null对象成员
ClassNotFoundEXception 不能加载所需的类
inputMismatchEXception 欲得到的数据类型与实际输入的类型不匹配
illegalArgumentEXception 方法接收到非法参数
ClassCastEXception 对象强制类型转换出错
NumberFormatEXception 数字格式转换异常,如把"abc"转换成数字

Java异常处理

Java的异常处理时通过5个关键字来实现的:try、catch、finally、throw和throws

语法:
try{

//需要监听的代码块

}

catch(异常类型 异常名称/e){

//对捕获到try监听到的出错的代码块进行处理

throw 异常名称/e;

//thorw表示抛出异常

throw new 异常类型(“自定义”);

}

finally{

//finally块里的语句不管异常是否出现,都会被执行

}

修饰符 返回值 方法名 () throws 异常类型{ //throws只是用来声明异常,是否抛出由方法调用者决定

//代码块

}

代码实例:使用try-catch-finally处理异常

public class Exception1 {
    public static void main(String[] args) {
        try {   //要监测的代码块
            Scanner in=new Scanner(System.in);
            System.out.print("请输入被除数:");
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(num1+"/"+num2+"="+num1/num2);
        }catch (InputMismatchException e){  //catch(异常类型 异常名称)
            System.out.println("被除数和除数必须要是整数");
        }catch (ArithmeticException e){
            System.out.println("除数不能为0");
        }catch (java.lang.Exception e){		//多重catch的使用
            System.out.println("其他未知异常");
        }
        finally {   //不管是否出现异常,finally一定会被执行。
            System.out.println("程序运行结束");
        }
    }
}

注意事项:

  1. 一段代码可能会引发多种类型的异常,这时,可以在一个try语句后面跟多个catch语句块分别处理不同的异常。但排序顺序必须时从子类到父类,最后一个一般都是Exception类。因为按照匹配原则,如果把父类放在前面,后面的catch语句块将不会被执行。
  2. 程序运行时,系统从上到下分别对每个catch语句块检测,并执行第一个相匹配的catch语句,执行其中一条catch语句之后,其后面的catch语句将被忽略。

代码实例:使用throws抛出异常

public class Exception2 {
    public static void main(String[] args) {	//main()方法
        try {   //要监测的代码块,为了更直观,将代码封装在了divide()方法中。
            divide();
        }catch (InputMismatchException e){  //catch(异常类型 异常名称)
            System.out.println("被除数和除数必须要是整数");
        }catch (ArithmeticException e){
            System.out.println("除数不能为0");
        }catch (java.lang.Exception e){     //多重catch的使用
            System.out.println("其他未知异常");
        }
        finally {   //不管是否出现异常,finally一定会被执行
            System.out.println("程序运行结束");
        }
    }
    //通过throws声明抛出异常
    public static void divide()throws Exception{ //这里是divide(),throws后可以有多个异常,逗号隔开

        Scanner in=new Scanner(System.in);
        System.out.print("请输入被除数:");
        int num1 = in.nextInt();
        System.out.print("请输入除数:");
        int num2 = in.nextInt();
        System.out.println(num1+"/"+num2+"="+num1/num2);
    }
}

补充:

1、如果调用者不知道如何让处理该异常,可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将由Java虚拟机来处理。

代码实例:使用throw抛出异常

public class Exception1 {
    public static void main(String[] args) {
        try {   //要监测的代码块
            Scanner in=new Scanner(System.in);
            System.out.print("输入被除数:");
            int num1 = in.nextInt();
            System.out.print("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(num1+"/"+num2+"="+num1/num2);
        }catch (InputMismatchException e){  	  
            System.out.println("被除数和除数必须要是整数");
            throw new InputMismatchException();   //抛出catch捕捉到的InputMismatchException异常
        }catch (ArithmeticException e){
            System.out.println("除数不能为0");
            throw new ArithmeticException();      //抛出ArithmeticException异常
        }catch (java.lang.Exception e){
            System.out.println("其他未知异常");
        }
        finally {   //不管是否出现异常,finally一定会被执行
            System.out.println("程序运行结束");
        }
    }
}

补充:

  1. throw和throws的区别:一、作用不同,throw用于程序员自行产生并抛出异常,throws用于声明该方法内抛出异常。二、使用位置不同,throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用。三、内容不同:throw抛出一个异常对象,只能是一个;throws后面跟异常类,可以跟多个。

你可能感兴趣的:(Java异常)