前言
对于异常的详细知识点可看我之前的文章
javaSE从入门到精通的二十万字总结(一)
以及对异常机制的科普补充
java异常处理机制
1. Error 和 Exception 的区别
两者父类都是 Throwable 类
Error 类: 一般是指与虚拟机相关的问题
Exception 类:分为运行时异常和编译时异常
- 不管是错误还是异常,都是可以抛出的
- 所有错误只要发生,java程序终止程序执行,退出jvm,错误是不能处理的
- 编译时异常:所有Exception的直接子类,都可以叫做是编译时的异常,表示必须在编写程序时候预先对这种异常进行处理,如果不处理编译器会出错。发生概率比较高。也叫受检异常(CheckedException)或者受控异常
- 运行时异常:所有RuntimeException及子类都属于运行时异常,运行时异常可处理也可不处理,发生概率比较低。叫未受检异常(UnCheckedException)或者非受控异常
2. throw 和 throws 的区别
- throws :在方法声明后面,表示上报异常信息给调用者
- throw :在方法体内部,由方法体内部的语句处理,手动抛出异常
3. final、finally、finalize 有什么区别
- final是一个关键字。表示最终的。不变的。修饰类、变量、方法。
类不能被继承,变量不能被重新赋值,方法不能被重写
- finally也是一个关键字,和try联合使用,使用在异常处理机制中。
不管是否有异常,这个代码块一定会被执行
- finalize()是Object类中的一个方法。作为方法名出现,finalize是标识符。
这个方法是由垃圾回收器GC负责调用的
4. try-catch-finally相关问题
==如果catch有return语句,finally还会执行吗?==
对基本数据类型,在 finally 块中改变 return 的值没有任何影响,直接覆盖掉;而对引用类型是有影响的,返回的是在 finally 对 前面 return 语句返回对象的修改值。
==哪个部分可以省略?==
(先科普一下:受检异常是编译器异常,非受检异常是运行时异常)
catch 和finally只能省略其中一个
不管受检还是非受检,finally都是可以省略
受检异常的时候,catch不可以省略,而非受检异常的时候,catch可以省略
5. finally在什么时候执行
无论出现什么情况,finally代码块的内容都会执行(除非碰到了exit函数才会退出)
即使try中有return的语句,finally的return语句都会把try中的return语句覆盖了
6. finally一定会被执行吗
答案是不是,有两种情况finally会不执行
进行try之前如果就有了异常,那么finally就不会执行
如果进入了try之后,遇到了exit,则finally同样不会被执行
7. 常见的异常有哪些
RuntimeException运行时异常:
NullPointerException:空指针异常
ClassCastException:类对象转换异常
IndexOutOfBoundsException:数组越界
SQLException:数据库异常
FileNotFoundException:文件路径异常
IOException:io异常
IllegalArgumentException:参数异常
8.主线程可以捕获到子线程的异常吗
不做特殊处理的话是捕获不到的
通过使用Thread 的静态方法
具体方法如下:Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandle());