📜  Java中的已检查与未检查异常| checked或unchecked异常

📅  最后修改于: 2020-04-05 06:48:31             🧑  作者: Mango

在Java中,有两种类型的异常:
1)已检查异常:是在编译时检查的异常。如果方法中的某些代码引发了检查的异常,则该方法必须处理该异常,或者必须使用throws关键字指定该异常。
例如,考虑以下Java程序,该程序在“ C\\test\\a.txt”位置打开文件并打印文件的前三行。该程序无法编译,因为函数main()使用FileReader(),而FileReader()抛出一个已检查的异常FileNotFoundException。它还使用readLine()和close()方法,并且这些方法还引发检查异常IOException

import java.io.*;
class Main {
    public static void main(String[] args) {
        FileReader file = new FileReader("C:\\test\\a.txt");
        BufferedReader fileInput = new BufferedReader(file);
        // 打印文件 "C:\test\a.txt"的前三行
        for (int counter = 0; counter < 3; counter++)
            System.out.println(fileInput.readLine());
        fileInput.close();
    }
}

输出:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code -
unreported exception Java.io.FileNotFoundException; must be caught or declared to be
thrown
    at Main.main(Main.Java:5)

要修复上述程序,我们要么需要使用throws指定异常列表,要么需要使用try-catch块。我们在以下程序中使用了throws。由于FileNotFoundExceptionIOException的子类,因此我们只需在throws列表中指定IOException即可使上述程序无编译错误。

import Java.io.*;
class Main {
    public static void main(String[] args) throws IOException {
        FileReader file = new FileReader("C:\\test\\a.txt");
        BufferedReader fileInput = new BufferedReader(file);
        // 打印文件 "C:\test\a.txt"的前三行"
        for (int counter = 0; counter < 3; counter++)
            System.out.println(fileInput.readLine());
        fileInput.close();
    }
}

输出:文件“ C:\ test \ a.txt”的前三行

2)未检查异常是在编译时未检查的异常。在C++中,所有异常均是未检查异常,因此编译器不会强制其处理或指定异常。程序员要文明起来,并指定或捕获异常。在ErrorRuntimeException类下的Java异常是未经检查的异常,对throwable下的所有其他内容都进行检查。

                   +-----------+
           | Throwable |
                   +-----------+
                    /         \
           /           \
          +-------+          +-----------+
          | Error |          | Exception |
          +-------+          +-----------+
       /  |  \           / |        \
         \________/      \______/         \
                            +------------------+
    unchecked     checked    | RuntimeException |
                    +------------------+
                      /   |    |      \
                     \_________________/
                       unchecked

考虑以下Java程序。它编译良好,但运行时会引发ArithmeticException。编译器允许它进行编译,因为ArithmeticException是未经检查的异常。

class Main {
   public static void main(String args[]) {
      int x = 0;
      int y = 10;
      int z = y/x;
  }
}

输出:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.main(Main.Java:5)
Java Result: 1

我们应该对异常进行检查还是取消检查?
如果可以合理地期望客户端从异常中恢复,请使其成为已检查的异常。如果客户端无法采取任何措施来从异常中恢复,请将其设置为未经检查的异常