一、异常抛出
### --- 基本概念
——> 在某些特殊情况下有些异常不能处理或者不便于处理时,
——> 就可以将该异常转移给该方法的调用者,这种方法就叫异常的抛出。
——> 当方法执行时出现异常,则底层生成一个异常类对象抛出,此时异常代码后续的代码就不再执行。
### --- 语法格式
——> 访问权限 返回值类型 方法名称(形参列表) throws 异常类型1,异常类型2,...{ 方法体; }
——> 如:
——> public void show() throws IOException{}
### --- 方法重写的原则
——> a.要求方法名相同、参数列表相同以及返回值类型相同,从jdk1.5开始支持返回子类类型;
——> b.要求方法的访问权限不能变小,可以相同或者变大;
——> c.要求方法不能抛出更大的异常;
### --- 注意:
——> 子类重写的方法不能抛出更大的异常、不能抛出平级不一样的异常,
——> 但可以抛出一样的异常、更小的异常以及不抛出异常。
### --- 经验分享
——> 若父类中被重写的方法没有抛出异常时,则子类中重写的方法只能进行异常的捕获处理。
——> 若一个方法内部又以递进方式分别调用了好几个其它方法,
——> 则建议这些方法内可以使用抛出的方法处理到最后一层进行捕获方式处理。
二、编程代码
package com.yanqi.task16;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionThrowsTest {
public static void show() throws IOException {
FileInputStream fis = new FileInputStream("d:/a.txt");
System.out.println("我想看看你抛出异常后是否继续向下执行???");
fis.close();
}
public static void test1() throws IOException {
show();
}
public static void test2() throws IOException {
test1();
}
public static void test3() throws IOException {
test2();
}
// 不建议在main方法中抛出异常 JVM负担很重
public static void main(String[] args) /*throws IOException*/ {
try {
show();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("------------------------------------");
try {
test3();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=57577:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task16.ExceptionThrowsTest
java.io.FileNotFoundException: d:\a.txt (系统找不到指定的文件。)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
at com.yanqi.task16.ExceptionThrowsTest.show(ExceptionThrowsTest.java:10)
at com.yanqi.task16.ExceptionThrowsTest.main(ExceptionThrowsTest.java:30)
java.io.FileNotFoundException: d:\a.txt (系统找不到指定的文件。)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
at com.yanqi.task16.ExceptionThrowsTest.show(ExceptionThrowsTest.java:10)
at com.yanqi.task16.ExceptionThrowsTest.test1(ExceptionThrowsTest.java:16)
at com.yanqi.task16.ExceptionThrowsTest.test2(ExceptionThrowsTest.java:20)
at com.yanqi.task16.ExceptionThrowsTest.test3(ExceptionThrowsTest.java:24)
at com.yanqi.task16.ExceptionThrowsTest.main(ExceptionThrowsTest.java:37)
------------------------------------
Process finished with exit code 0
四、异常抛出补充:编程代码
package com.yanqi.task16;
import java.io.IOException;
public class ExceptionMethod {
public void show() throws IOException {}
}
五、编程代码
package com.yanqi.task16;
import com.sun.jdi.ClassNotLoadedException;
import java.io.FileNotFoundException;
import java.io.IOException;
public class SubExceptionMethod extends ExceptionMethod {
@Override
public void show() throws IOException {} // 子类重写的方法可以抛出和父类中方法一样的异常
//public void show() throws FileNotFoundException {} // 子类重写的方法可以抛出更小的异常
//public void show() {} // 子类可以不抛出异常
//public void show() throws ClassNotLoadedException {} // 不可以抛出平级不一样的异常
//public void show() throws Exception {} // 不可以抛出更大的异常
}