为什么在尝试编写捕获时应该存在异常抛出的可能性?

Sur*_*ran 3 java exception-handling language-design exception

我正在玩一些异常程序,并遇到了一些我以前从未遇到过的惊喜.

import java.io.*;

class ExceptionTest
{
  public static void main(String[] args)
  {
    try
    {
      System.out.println("hello");
    }
    catch(IOException ioe)
    {
      System.err.println("ioexception was thrown!!");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这会引发编译器错误:

ExceptionTest.java:10: exception java.io.IOException is never thrown in body of
corresponding try statement
catch(IOException ioe)
^
1 error
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么会这样?

为什么编译器担心它肯定永远不会达到的代码片段.它可能只是一个警告,而不是一个完整的错误.毕竟我们可能希望保留catch块作为我们可能进行的一些未来更改的备份,或者程序员在一些编辑后忘记删除它.

我知道我知道它可以避免不必要的击键等等.但它不应该麻烦编译器引起错误.还是有其他原因吗?

代码中的IOException catch块也会产生编译器错误,但Exception catch块不会......为什么会这样?Thnx提前!!

T.J*_*der 8

因为Java设计者认为系统应该以这种方式提供帮助.这与以下情况相同:

public class EarlyReturn {
    public void foo() {

        return;

        System.out.println("Hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

...这也导致编译时错误.永远不会运行的代码是一件坏事,编译器通过让我们知道它永远不会运行来帮助我们,设计师认为它应该是一个错误而不是一个警告.

您可以将代码更改为捕获Exception而不是IOException您喜欢,但是虽然这会使编译器允许您执行此操作,但您仍然可以使用永远不会运行的代码(这也是一件坏事).

同样的IOException代码catch块产生一个编译器错误,但一个Exceptioncatch块不......这是为什么?

IOException是一个经过检查的异常,只有以这种方式检查已检查的异常(这就是为什么要调用它们).有检查的异常,未经检查的异常(RuntimeException及其子类)和错误(Error及其子类).从技术上讲,已检查的异常是所有异常都不是未经检查的异常或错误(JLS的第11.1.1节),但是 - 这是一个黑暗的角落 - 并未检查所有已检查的异常.具体而言,检查已检查的异常,除非它们是Exception类.来自JLS的第11.2.3节:

如果一个catch子句可以捕获已检查的异常类,那么这是一个编译时错误,并不是这个子句对应的块可以抛出一个已检查的异常类,它是子类或超类,除非是或是超类.E1trycatchE1E1ExceptionException

第11节的全部内容可能值得一读.正如你可以猜到的那样,这是Java的一部分,在早期发展得相当多,导致这个有些复杂的定义被检查的内容.