基本概念:
在某些特殊情况下,有些异常不能处理,或者不便于处理时,就可以 将 该异常 转移给
该方法的 调用者, 这种方法 就叫 异常的抛出。
当方法执行时出现异常,则底层生成一个 异常类对象 抛出,此时异常代码后续的代码 就不再执行。
语法格式:
访问权限 返回值类型 方法名称(形参列表) throws 异常类型1, 异常类型2,... { 方法体;}
如:
public void show() throws IOException {
}
示例:
public class ExceptionThrowsTest {
public static void show throws IOException(){
FileInputStream fis = new FileInputStream("d:/a.txt"); // 发生异常
printIn ("我想看看你抛出异常后是否继续向下执行"); // 没有执行
fis.close();
}
// 不建议在main方法中抛出异常, 因为 JVM的负担已经很重了
public static void main(String[] args) /* throws IOException */ {
try {
show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
异常抛出的补充
示例:
// 父类
public class ExceptionMerhod {
public void show() throws IOException {
}
}
// 子类
public class SubExceptionMethod extends ExceptionMethod {
@Override
// public void show() throws IOException { } // 子类重写的方法可以抛出和父类中方法一样的Exception
// public void show() throws FileNotFoundException { } // 子类重写的方法可以抛出更小的Exception
// public void show() {} // 子类可以 不抛出异常
// public void show() throws ClassNotLoadedException {} // 不可以抛出平级不一样的异常
// public void show() throws Exception {} // 不可以抛出更大的异常 (”孩子不能比爹更坏“)
}
经验:
1. 若父类中被重写的方法没有抛出异常时,则子类中重写的方法只能进行异常的捕获处理。 (因为子类不能抛出更大的异常)
2. 若一个方法内部又以递进方式分别调用了几个好几个其他方法,则建议这些方法内可以使用抛出的方法处理到外面一层进行捕获方式处理。
经验2 - 示例:
public class ExceptionThrowsTest {
public static void show throws IOException(){
FileInputStream fis = new FileInputStream("d:/a.txt"); // 发生异常
printIn ("我想看看你抛出异常后是否继续向下执行"); // 没有执行
fis.close();
}
public static void test1() throws IOException { // 抛到外面一层 - show()
show();
}
public static void test2() throws IOException { // 抛到外面一层 - test1()
test1();
}
public static void test3() throws IOException { // 抛到外面一层 - test2()
test2();
}
main(){
try{
test3();
}
catch(IOException e){
e.printStackTrace();
}
}
}