声明抛出异常
这个体系中的所有类和对象都具备一个独有的特点;就是可抛性。可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
语法格式:
[修饰符] 返回值类型 方法名([参数列表])[throws 异常列表]{
// throw 异常对象;
}
throws是方法可能抛出异常的声明。用在声明方法时,表示该方法可能要抛出异常。异常列表位于方法体之前,可抛出多种类型的异常,每个类型之间用逗号隔开。
当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。
人工抛出异常
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出。首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。
IOException e = new IOException();
throw e;
可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:
throw new String("抛出异常");
throw 和throws关键字的区别:
throw用于抛出异常对象,后面跟的是异常对象;throw用在方法内。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开;throws用在方法上。
重写方法声明抛出异常的原则
重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下,对testMethod()方法的调用-异常的捕获按父类声明的异常处理。
public class A {
public void testMethod() throws IOException {
// ……
}
}
public class B extends A {
public void testMethod() throws FileNotFoundException {
// ……
}
}
public class C extends A {
public void testMethod() throws Exception { // 报错
// ……
}
}
注意:
如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果此时子类的覆盖的方法中出现了异常,只能try不能throws。
如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。
异常处理原则
功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
通常情况:方法内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。
定义异常处理时,什么时候定义try,什么时候定义throws呢?
功能内部如果出现异常,如果内部可以处理,就用try;
如果功能内部处理不了,就必须声明出来,让调用者处理。
处理异常时不可以直接打印,或者直接输出,正确的处理方式:
1)根据异常情况处理对应的逻辑
2)使用文件记录异常,便于日后查看