总之,一个方法必须声明所有的受查异常,而非受查异常要么不可控制,要么就应该避免发生。
对于已经存在是异常类:
1)找到一个合适的异常类
2)创建这个类的一个对象
3)将对象抛出
一旦抛出了异常,这个方法就不可能返回到调用者。也就是说,不必为返回的默认值或错误代码担忧
对于子类覆盖父类含有异常方法的解释
解释:定义了一个父类People
类,以及其三个子类Children
, Adults
, Olds
. 假设在父类中有一个冷空气事件,那么它就会抛出一个Sick类型的异常。但是由于三个子类的抵抗疾病的能力不同,那么Adults类由于抵抗力较强,其方法可能不抛出异常。而Children和Adults类型,由于抵抗力较弱,可能抛出Sick类型的不同子类型。但是需要注意的是,子类不能抛出与Sick类完全不相关的异常类型,例如身高Height类型。因为必须把父类作为一个大前提,其子类不能抛出比父类异常更加出格的异常,否则无法进行识别。
1,捕获异常
通过try catch语句,捕获异常
1.2 捕获多个异常
eg,catch(FileFoundException | UnkeownHostException e){...}
注意:捕获多个异常时,异常变量默认为final类型
1.3 再次抛出异常和异常链
在catch语句中可以抛出一个异常,目的是为了改变异常的类型
可以将原始异常作为新异常的原因,例如:
try
{
//access the database
}
catch (SQLException e)
{
Throwable se = new ServletException("database error");
se.initCause(e);
throw se;
}
通过这种包装技术,可以使得用户抛出子系统的高级异常,而不会丢失原始异常的细节
1.3 finally 子句
为了恰当的解决产生资源回收问题
不管异常是否产生,finally都将会被执行
为了防止catch语句继续抛出时没有执行finally语句,建议将try/finally 和 try/catch 两种语句进行耦合,例如:
InputStream in = ...;
try
{
try
{
code that might throw exception
}
finally
{
in.close();
}
}
catch (IOException e)
{
show error message
}
值得注意的是,finally中语句也有可能会出现异常,当出现这种情况时,原始的异常将会丢失,转而抛出新的异常
1.4 带资源的try语句
带资源的try语句可以处理好异常覆盖的情况,原来的异常会重新抛出,而close方法抛出来的异常会被 “ 抑制 ” 。这些异常会被自动捕获,并由addSuppressed方法增加到原来的异常。若果对这些感兴趣可以调用getSupprssed方法,它会得到从close方法抛出并被抑制的异常列表。
早抛出,晚捕获
断言
断言机制允许在测试机制期间向代码插入检查语句,当发布代码时,将插入的检测语句自动移走
引入关键字:assert
其有两种形式:
1) assert 条件;
2) assert 条件 :表达式;
两种形式都会对条件进行检测,如果结果为false,就会抛出一个AssertionError异常。在第二中形式中,表达式将会被传入一个AssertionError构造器,并将其转化成一个消息字符串。
、注:调试技巧 P304。