异常处理
异常的定义
1.异常是在代码序列运行时出现的非正常事件,是特殊的运行错误对象。异常的发生将阻止程序正常运行,并可能出现以下两种情况。
1)程序运行终止,控制权返回给操作系统
2)程序运行终止,系统死机崩溃状态
异常类
1.java提供了以Throwable类为基类的一系列异常类和错误类。throwable有两个直接的子类--Error(错误类)和Exception(异常类),Error类代表程序出现的错误,如程序运行时系统内部错误或资源耗尽等。这种错误是不能通过修改程序代码来恢复的。Exception类,代表程序出现的异常。
2.Exception类包括运行异常类(RuntimeException及其子类)和非运行异常类,运行异常类的产生一般由程序员的编程错误引起,完全可以通过改进程序避免,所以java编译器对此类异常不进行检查。非运行异常类是由运行环境引发的异常,eg:文件读写错误,数据库连接不通,找不到文件等。所以java编译器要求java程序必须捕捉或处理所有非运行异常。
常见的异常类
Throwable常见方法
异常处理
1.java中异常处理是通过try……catch……fianlly语句来实现的,具体格式为:
try{ 可能抛出异常的语句 } catch(异常类型1 异常对象){ 对异常类型1对象的处理 } catch(异常类型2 异常对象){ 对异常类型2对象的处理 } …… …… …… catch(异常类型n 异常对象){ 对异常类型n对象的处理 } finally{ 不管是否出现异常,必须执行的语句 }
说明:
1)将有可能出现异常的代码用try-catch语句块进行处理,当try语句块中的代码运行出现异常时,则进入catch语句块,从上至下依次与catch语句块中的异常类型进行查找匹配(检查以抛出的异常对象类型是否与该catch语句块中指定的异常类型相同或为其子类)执行完catch代码块中的程序代码后,将继续执行catch代码块后的其他代码,而不会执行try代码块中发生异常语句后面的代码。
2)在异常处理中,最多有一个catch语句块会被执行。另外,如果有多个catch语句块,且catch语句块中的参数所指定的异常类型有父子继承关系,则要求处理子类异常的catch语句块放在处理父类异常的catch语句块的前面。否则会出现编译错误。
3)由于finally语句块中的代码肯定会被执行,所以通常在finally语句块中进行资源的清除工作。
在方法中抛出异常
1.若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。
使用throws关键字抛出异常
1)throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。
2)如果是Error、RuntimeException或它们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
使用throw关键字抛出异常
1)throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指定要抛出的异常;如果要捕获throw抛出的异常,则必须使用try-catch语句块。
2)throw通常用来抛出用户自定义异常。
自定义异常类
1.自定义异常类必须继承Exception类或其子类
class MyException extends Exception{ public MyException(String ErrorMessage) { super(ErrorMessage); } }
2.自定义异常的抛出
1)自定义异常不可能依赖系统自动抛出,因为系统不知道错误在哪里,所以需在自定义的出错位置借助于throw语句抛出自定义的异常类对象。用throw语句抛出异常对象的语法格式为:
修饰符 返回类型 方法名(参数列表)throws 异常类名列表{ …… …… …… throw 异常类对象 …… …… …… }
说明:
1)一般这种抛出异常的语句应该被定义为在满足一定条件时执行。
2)含有throw语句的方法。应该在方法头定义中增加“throws 异常类名列表"。如果方法中的throw语句中不止一个,则在异常类名列表中一一列出,中间用逗号隔开。
public class Test { static int dev(int number1,int number2) throws MyException,IOException{ if(number1<0||number2<0) { throw new MyException("不可以使用负数"); } if(number1>100||number2>100) { throw new MyException("数值太大"); } return number1/number2; } public static void main(String[] args) { try { int result=dev(10,0); System.out.println(result); } catch(MyException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } }
异常使用原则
1.在当前方法声明中使用try-catch语句捕获异常
2.一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类
3.如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常
注:Error、RuntimeException或它们的子类,可以不使用throws关键字来声明要抛出的异常
//原则2 public class Text extends father{ public void fun() throws ClassNotFoundException{ } public static void main(String[] args) { } } class father { public void fun() throws IOException,ClassNotFoundException{ } } //原则3 public class Text extends father{ public void fun() throws ClassNotFoundException,FileNotFoundException{ } public static void main(String[] args) { } } class father { public void fun() throws IOException,ClassNotFoundException{ } public void fun1() throws FileNotFoundException{ } }
2018-11-25