目录
*本笔记仅记录了异常部分的内容
异常概述
1.异常的定义:程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
2.异常对象都是派生于Throwable类的一个类的实例。
3.Throwable分类:
-
Error:严重错误Error,无法通过处理的错误,只能事先避免。
-
Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。
4.Exception分类:
-
编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
-
运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)
5.Throwable中的常用方法:
-
public void printStackTrace()
:打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
-
public String getMessage()
:获取发生异常的原因。提示给用户的时候,就提示错误原因。
-
public String toString()
:获取异常的类型和异常描述信息(不用)。
6.不需要声明Java的内部错误,即从Error类继承的异常,我们对这些异常无法控制。
7.不应使用从RuntimeException中继承的非检查型异常。因为这些运行时的错误完全在我们的控制之中,应该多花时间修正这些错误,而不仅仅是声明这些错误有可能发生。
异常处理
1.如果子类覆盖了超类的方法,子类方法中声明的检查型异常不能比超类方法中声明的异常更通用,如若超类没有声明任何类型的异常,子类也不能抛出任何类型的异常。
2.finally子句包含return语句时,会遮蔽catch或try块的返回值。
3.finally子句主要用于清理资源,不要把控制流程的语句(return,throw,break,continue)放在finally中。
4.finally子句的使用可以被try-with-resources语句代替,其基本形式为:
try (Resources res = ...)
{
work with res...
}
try块退出时,会自动调用res.close()。也可以在try后的括号中使用分号间隔,添加多个资源。
异常处理的技巧
1.异常处理不能代替简单的测试
与完成简单的测试相比,捕获异常所花费的时间大大超过了前者。因此,只在异常情况下使用异常。
2.不要过分地细化异常
这种编程方式将导致代码量的急剧膨胀。时刻记住异常处理的一个承诺:将正常处理与错误处理分开。
3.充分利用异常层次结构
选择最合适的异常类进行处理,必要时自己创建异常类。
4.不要压制异常
如果认为异常非常重要,即使它发生的概率很小,也应该为它适当地进行处理。
5.在检测错误时,“苛刻”要比放任更好
6.不要羞于传递异常
5、6可以归纳为“早抛出,晚捕获”