Java异常报错的详细解析(二)
Error和Exception区别是什么
1.Error类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常程序会被终止,仅靠应用程序本身无法恢复
2.Exception类的错误是可以在应用程序中进行捕获并进行处理的,通常遇到这类错误,应对其进行处理,使应用程序可以继续正常运行。
运行时异常和一般异常(受检异常)区别
1.运行时异常包括RuntimeException类及其子类,表示JVM在运行期间可能出现的异常,编译器不会检查运行时异常
2.受检异常是Exception中除了RuntimeException及其子类之外的异常。编译器会检查受检异常。
RuntimeException异常和受检异常的区别
是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则选择非受检异常(RuntimeException)。
一般来说,如果没有特殊要求,建议使用RuntimeException异常。
JVM如何处理异常
1.在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给JVM
2.该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态
3.创建异常对象并转交给JVM的过程称为抛出异常。可能有一系列方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈
4.JVM会顺着调用栈去查找看是否有可以处理的异常代码,如果有,则调用异常处理代码。
5.当JVM发现可以处理异常的代码时,会把发生的异常传递给它。如果JVM没有找到可以处理的异常代码块,JVM则会转交给默认的异常处理器(默认处理器为JVM的一部分),默认异常处理器打印出异常信息并终止应用程序。
throw和throws的区别
异常处理除了包括捕获异常和处理异常之外,还包括声明异常和抛出异常,可以通过throws关键字在方法上声明该方法要抛出的异常,或者在方法内部通过throw抛出异常对象
使用上的区别
1.throw关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或者代码中的异常,受查异常和非受查异常都可以抛出
2.throws关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。
3.一个方法用throws标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用throws关键字声明相应的异常。
final、finally、finalize的区别
1.final可以修饰类、变量、方法,修饰类表示该类不能被继承,修饰方法表示该方法不能被重写,修饰变量表示该变量不能被重新赋值
2.finally一般用于在try-catch代码块中,在处理异常时,将一定要执行的代码放到finally代码块中,表示不管是不是出现异常,该代码块都会执行,一般
用来存放一些关闭资源的代码。
3.finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前 做必要的清工作。
NoClassDefFoundError和ClassNotFoundException区别
1.NoClassDefFoundError是一个Error类型的异常,由JVM引起,不应该尝试捕获这个异常
2.引起该异常的原因是JVM或ClassLoader尝试加载某类时在内存中找不到该类的定义,该动作发生在运行期间,即编译时该类存在,运行时找不到了,可能是编译后被删除了等原因导致。
ClassNotFoundException是一个受查异常,需要显示地使用try-catch对其进行捕获和处理,或在方法签名中用throws关键字进行声明。当使用Class.forName,ClassLoader.loadClass或ClassLoader.findSystemClass动态加载类到内存中时,通过传入的类路径参数没有找到该类,就会抛出异常;另一种抛出该异常的可能原因是某个类已经由一个类加载器加载到内存中,另一个加载器又尝试去加载它。
try-catch-finally中哪个部分可以省略
catch
1.try适合处理运行时异常,try-catch适合处理运行时异常和普通异常。
2.如果只用try处理普通异常不加catch则编译不通过,报错,编译器硬性规定,普通异常如果选择捕获,则必须用catch显示声明以便进一步处理
3.如果只处理运行时异常,catch可以省略
4.对一段代码加上try,等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理,运行时异常,捕获丢弃+finally扫尾处理,可以不需要catch,或者加上catch捕获以便进一步处理。
try-catch-finally中,如果catch中return了,finally还会执行吗
会执行,在return前执行
如果存在finally代码块,try中的return语句不会立马返回给调用者,而是记录返回值等待finally代码块执行完毕之后再向调用者返回记录的值
如果在finally中修改了返回值,就会返回修改后的值,所以不允许在finally里有return语句。
————————————————
版权声明:本文为博主「菠萝印象威」的原创文章