异常处理机制:让程序更健壮,服务器不会因为遇到异常而宕机!
int a=10;
int b =0;
int c=a/b;
有异常发生其实是底层new了一个异常对象,打印出来了。
Java的异常处理机制
UML图如下所示:
左分之Error不可以处理,都是直接return的,退出jvm虚拟机 ,右分之Exception是可以处理的
所有RuntimeExpection的直接子类是运行时异常
所有Exception的直接子类是编译时异常(编译时异常又称为受检异常/受控异常:CheckedException)
·编译时异常不是在编译阶段发生的,编译时异常是表示必须在编写程序的时候预先对这种异常处理,如果不处理,编译器报错
·运行时异常(运行时异常又称为非受检异常/非受控异常:UncheckedException)在编写程序阶段可以处理也可以不处理
所有异常都是发生在运行阶段的(因为要new异常对象)
·编译时异常与运行时异常的区别?
编译时异常发生的概率比较高
运行时异常发生的概率比较低
java语言中对异常的处理包括两种方式:
·第一种方式:在方法声明的位置上,使用throws关键字,抛给上一级(抛别的异常不行,只能抛此异常或者其父类异常)
·第二种方式:使用try…catch语句进行异常的捕捉(main方法中建议使用)
`注意:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续向上抛,抛给了调用者JVM,JVM知道了这个异常,只有一个结果:终止Java程序的执行。
throws用法:
在方法声明的位置上使用了throws ClassNotFoundException
这个代码表示doSome()方法执行过程中,有可能会出现ClassNotFoundException异常
这个异常父类是Exception,所以ClassNotFoundException属于编译时异常
try catch 语法:
e引用保存的内存地址是那个new出来异常对象的内存地址。
try…catch把异常捕获后,继续执行catch语句块后面的代码。(catch可以写多个,写多个的时候遵循从上到下,从小到大原则)
注意:只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行。
另外注意:try语句块中的某一行出现异常,该行后面的代码不会执行。
在jdk8中新特性可以在异常中加“|”来catch多个异常。
方法选择:如果需要调用者处理,则上报;否则Try Catch;
异常对象有两个非常重要的方法:
获取异常简单的描述信息:
String msg = exception.getMessage();
打印异常追踪的堆栈信息:
exception.printStackTrace();一般使用这个
运行结果:
查看异常信息,应该从上往下看跳过SUN公司的代码,看自己的第一行代码。
//解决异常的两种方式:
1.在方法声明上继续throws 2.try{}... catch(){}
public static void main(String[] args) throws ClassNotFoundException{
try {
m1();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private static void m1() throws FileNotFoundException {
m2();
}
private static void m2() throws FileNotFoundException {
m3();
}
private static void m3() throws FileNotFoundException {
new FileInputStream("E:\得邦照明公司\2021.11.8-11.12\11.12")
}
关于try… catch中的finally子句:
在finally子句中的代码是最后执行的,并且是一定会执行的,即使try语句块中的代码出现了异常。
`finally子句必须和try一起出现,不能单独编写。(try 也不能单独使用)
流使用完需要关闭,因为流是占用资源的,而try中出现异常有可能会导致关闭流的语句无法执行,所以需要finally语句(需要注意:将声明变量放在try语句块外面,这样才可以在finally中使用。)
注意 退出jvm虚拟机 finally语句块就不执行了
注意一个面试题:
最后得出i是100,通过反编译(.class文件---->.java文件)之后效果如下:
它底层改了代码使得语法规矩还能行得通。
final、finally、finalize的区别
1.final是关键字 赋值一次就不能再改变
2.finally 也是关键字,和try联用,一定会执行的语句块
3.finalize()是Object类中 的一个方法。作为方法名出现,是标识符
此方法是jvm的GC垃圾回收器负责调用
重点掌握:
自定义异常:throw 手动抛出异常
语句:throw new FileNotFoundException(“异常信息”)
1.编写一个类继承 Exception或者RuntimeException
2.提供两个构造方法,一个无参数的,一个带有String参数的
在实际开发中应用可以自定义异常解决如栈满时再压栈提示异常 不终止程序。
在方法覆盖中,重写之后的方法不能比重写之前的方法抛出更多(更宽泛)的异常,可以更少。



