异常处理
异常概念:
程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。
在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是产生了一个异常对象。
异常体系图:
异常分类
严重错误,无法通过处理的错误。
运行时异常,运行时可能会报错,可以不处理。如数学异常。
编译时异常,编译时无法编译通过。如日期格式化异常。
异常处理
Java默认处理方式:
JVM有一个默认的异常处理机制,即将该异常的名称、异常的信息、异常出现的位置打印在了控制台上,同时将程序停止运行。
标准打印流与错误打印流不同步。
异常相关操作:
创建异常对象(JDK已定义的异常会自动创建对象,自定义异常需要手动创建)
抛出异常(JDK已有定义的异常会自动抛出异常,自定义异常需要手动抛出)
处理异常
程序员在有异常抛出时,异常的处理方法有两种:
将异常捕获并处理
声明抛出异常
将异常捕获并处理格式:
格式一:
try{
需要检测的代码;
}catch(异常类 变量){
异常处理代码;
}
格式二:
try{
需要检测的代码;
}catch(异常类 变量){
异常处理代码;
}finally{
必须被执行代码
}
格式三:
try{
需要检测的代码;
}finally{
必须被执行代码;
}
多异常捕获处理:
分别捕获分别处理,每个try对应一个catch
分别捕获分别处理,一个try对应所有catch
注意:大的异常不能在前边捕获
一次捕获共同处理
注意:不能同时捕获大的异常与小的异常
异常常见方法
重写了toString方法
public String getMessage()
public void printStackTrace()
public void printStackTrace(PrintStream s)
声明抛出异常与抛出异常
throws:用于声明函数抛出异常。用于函数声明。
是异常对象的处理方式之一。
多个异常可以同时声明抛出,用逗号分隔。
throw:用于抛出异常对象。用于函数内容。
当出现JDK异常对象时,JVM会自动创建一个异常对象并抛出。
自定义异常对象可以先创建异常对象,再使用throw抛出。抛出后再进行处理;或使用捕获或使用声明抛出。
自定义异常
如果涉及其他需求,JDK没有提供相应的异常对象,则可以自己定义异常。
定义格式:继承Exception或者RuntimeException。同时需要带参的构造方法,用于接收异常信息。
class MyException{
public MyException(String message){
super(message);
}
}
异常处理注意细节
运行时异常被抛出可以不处理。即不捕获也不声明抛出。
如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。
父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。
finally语句只有在退出虚拟机的情况下不会被执行。
注意不要超出异常捕获处理时的变量作用域。