Java错误和异常
2018-06-09 本文已影响11人
Joe_blake
一、顶级异常类-----Throwable
Throwable继承自Object类,实现了Serializable接口,可以进行序列化。常用的子类有Exception和Error
1.序列化的作用
在Throwable类中使用输出流来进行输出,并把其对象作为输出流对象,这就需要必须实现序列化接口,使得其可以进行序列化,才能作为输出流中的对象进行输出。
2.Exception和Error
- Exception指Java程序设计中,可以预料到在运行时可能发生并且应该被捕获的错误,需要相应的处理;
- Error主要是用于表示Java和虚拟机内部的异常信息,其不便于捕获,也难以处理;
一、Throwable的两大子类------Exception和Error
1. Exception和Error的设计与分类
imageException类分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception)。
- RE能通过编译,但会在运行时抛出,如果未进行处理会导致程序崩溃。RE是完全可以在编程中避免的,因而是不受编译器检查的(unchecked,也包括Error),例如:NullPointerException、ArrayIndexOutOfBoundsException等;
- CE是指不能通过编译器检测的异常情况,这总异常通常难以避免,必须try...catch...进行处理,例如:FileNotFoundException。
question:ClassNotFoundException和 NoClassDefFoundError的区别?
- NoClassDefFoundError 是程序在编译时候可以找到其依赖的类,但是在运行时找不到或者可以找到多个相同的依赖类,此时抛出NoClassDefFoundError
- ClassNotFoundException通常是在类路径错误,或者类名称发生更改时抛出,编译器无法通过路径加载该类,即无法通过编译。
2. 如何处理好Exception
- 不要捕获Exception这样的通用异常,而应捕获特定的异常,并对其作出相应的处理。
例示:
//no
try {
.....
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//yes
try {
.....
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.(TAG,"线程中断/阻塞,需要清理");
}
- 尽早的抛出异常,以便分析堆栈日志,或者详细地输出到Log中,以便分析。
private void read(String filename) {
Objects.requireNonNull(filename);
try {
InputStream in = new FileInputStream(filename);
} catch (FileNotFoundException e) {
Log.(TAG,"文件路径错误");
}
}
3. 如何自定义异常
- 所有异常都必须是 Throwable 的子类。
- 自定义检查性异常类,继承 Exception 类。
- 自定义运行时异常类,继承 RuntimeException 类。
4. 注意事项
- try-catch会产生额外的性能开销,影响JVM对代码进行优化。所以只需try住必要的代码段,而不是整个一大段代码。
- 不要用try-catch的形式控制代码流程(逻辑),远比switch-case、if-else要低效。
- Java在实例化Exception时,都会对当时的栈进行快照,当频繁进行该操作时,会影响到性能。
- 尽可能的就地处理异常,而不是向上抛出/只捕获不处理。
- 不要在finally中处理返回值,会覆盖掉try代码块里面的return。
-
当try和catch中有return时,finally仍然会执行;
-
finally中包含return,不会对try块中要返回的值进行保护
public static int test() {
int i=0;
try {
i = 1;
return i;
} finally {
i = 2;
return i;
}
}
//返回 2