Java进阶-使用 throws 关键字声明异常

处理异常有两种方式

  • 声明抛出:throws
  • 捕捉:try…catch…

先研究第一种方式:声明抛出,在方法声明的位置上使用 throws 关键字向上抛出异常

声明抛出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.FileInputStream;
public class ExceptionTest02 {

public static void main(String[] args) {
// 创建文件输入流,读取文件
FileInputStream fils = new FileInputStream("c:/a.txt");

// Java编译器如何知道以上的代码执行过程中可能出现异常呢?
// 因为 FileInputStream 这个构造方法在声明的位置上使用了 throws FileNotFoundException

// 以上编译不通过,必须对其进行捕捉或声明抛出
/*
* Exception in thread "main" java.lang.Error: Unresolved compilation problem:
* Unhandled exception type FileNotFoundException
*
* at test0222.ExceptionTest02.main(ExceptionTest02.java:9)
*/
}
}

怎么声明抛出呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.FileInputStream;
public class ExceptionTest02 {

// FileNotFoundException < IOException < Exception,包含关系,所以都能够用来声明抛出
// public static void main(String[] args) throws FileNotFoundException {
// public static void main(String[] args) throws IOException {
public static void main(String[] args) throws Exception {

// 创建文件输入流,读取文件
FileInputStream fils = new FileInputStream("c:/a.txt");

// 抛出错误
/*
* Exception in thread "main" java.io.FileNotFoundException: c:\a.txt
* (系统找不到指定的文件。) at java.io.FileInputStream.open0(Native Method) at
* java.io.FileInputStream.open(FileInputStream.java:195) at
* java.io.FileInputStream.<init>(FileInputStream.java:138) at
* java.io.FileInputStream.<init>(FileInputStream.java:93) at
* test0222.ExceptionTest02.main(ExceptionTest02.java:12)
*/
}
}

深入 throws

使用throws处理异常不是真正处理异常,而是推卸责任

谁调用就会抛给谁

所以以下程序 m1 方法如果出现了异常,因为采用的是上抛,给了 JVM,JVM 遇到这个异常就会退出,所以打印的代码不会执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionTest03 {

public static void main(String[] args) throws FileNotFoundException {
m1();
// 不可以打印
System.out.println("测试");
}

public static void m1() throws FileNotFoundException {
m2();
}

private static void m2() throws FileNotFoundException {
m3();
}

private static void m3() throws FileNotFoundException {
new FileInputStream("c:/a.txt"); // FileNotFoundException 构造方法声明位置上使用 throws(向上抛)
}
}

真正处理可以使用try...catch...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionTest03 {

public static void main(String[] args) {

// 真正处理
try {
m1();
} catch (FileNotFoundException e) {
// TODO: handle exception
}
// 可以打印
System.out.println("测试");
}

public static void m1() throws FileNotFoundException {
m2();
}

private static void m2() throws FileNotFoundException {
m3();
}

private static void m3() throws FileNotFoundException {
new FileInputStream("c:/a.txt"); // FileNotFoundException 构造方法声明位置上使用 throws(向上抛)
}
}