为什么我们需要在 Java 中处理或抛出检查异常?

sou*_*dar -1 java exception checked-exceptions

我是Java新手,我读到仅在编译时引发检查异常,即如果存在未处理或抛出的检查异常,程序将无法成功编译。如果有什么东西阻止编译器编译代码,那么我们可以删除它或以其他方式重新编码,这样问题就不会存在。

例如,如果我们试图打开系统中不存在的文件,我们不应该只是打开它。那么为什么需要处理/抛出这些异常呢?

Ste*_*n C 6

这里的概念问题是您混淆了编译时发生的事情和运行时发生的事情;即当程序由程序员编译时和由用户运行时。

在编译时,编译器分析程序以确定可能引发哪些异常。例如

public static void main(String[] args) {
    FileInputStream fis = new FileInputStream(args[0]);  // HERE
}
Run Code Online (Sandbox Code Playgroud)

构造FileInputStream(String)函数声明为throws IOException. (查找一下。)因此编译器知道 at 的语句HERE 可能会抛出IOException. 并且IOException是一个受检查的异常。(查一下。)

它不知道它。它不可能知道它……因为它不知道args[0]会包含什么。这只有在运行时才知道;即当程序运行并且用户提供一些命令行参数时。

问:这里检查异常是什么意思?

这意味着该main方法要么必须声明为(例如)throws IOException,要么必须在try-catch语句中捕获它。

问:那么为什么是检查异常呢?

因为它是这样声明的!

问:为什么这样宣布?

强制程序员处理正在打开的文件不存在、不可读等可能性。当程序(最终)运行时。

编译器的意思是“对可能发生的事情采取一些措施......”。


只是重申一下。编译器无法检查文件是否存在,因为它不知道用户将提供什么路径。即使它确实知道,并且它检查了1该文件在编译时是否存在,它也不知道该文件在运行时是否仍然存在,可能在不同网络上的完全不同的机器上......很多年了未来。

1 - 这是假设的。它不检查。这是毫无意义的。