当前位置: 首页 > 知识库问答 >
问题:

为什么不抛出异常的代码允许捕获检查异常?

司马奇希
2023-03-14
public abstract int read() throws IOException;
public int read() { // does not compile
    throw new IOException();
}
// Error: unreported exception java.io.IOException; must be caught or declared to be thrown
public void safeMethod() { System.out.println("I'm safe"); }

public void test() { // method guarantees not to throw checked exceptions
    try {
        safeMethod();
    } catch (Exception e) { // catching checked exception java.lang.Exception
        throw e; // so I can throw... a checked Exception?
    }
}
public void test() { // guarantees not to throw checked exceptions
    try {
        safeMethod();
    } catch (Exception e) {        
        throw (Exception) e; // seriously?
    }
}
// Error: unreported exception java.lang.Exception; must be caught or declared to be thrown

编译器知道检查的异常不能在安全方法内抛出-所以也许它应该允许只捕获未检查的异常?

回到主要问题--有没有理由以这种方式实现捕获检查异常?这仅仅是设计中的一个缺陷还是我遗漏了一些重要的因素--也许是向后的不兼容性?在此场景中,如果只允许捕获runtimeexception,可能会出现什么问题?实例非常感谢。

共有1个答案

慎建本
2023-03-14

引用Java语言规范§11.2.3:

如果catch子句可以捕获已检查异常类E1,并且与catch子句相对应的try块不能抛出E1的子类或超类已检查异常类,则这是编译时错误,除非E1是异常或异常的超类。

我猜这个规则早在Java7之前就已经产生了,在Java7中,多抓取并不存在。因此,如果您有一个try块可以引发大量异常,那么捕获所有异常的最简单方法就是捕获一个公共超类(在最坏的情况下,可以使用exception,如果您还想捕获error,则可以使用throwable)。

try {
    System.out.println("hello");
} catch (IOException e) {  // compilation error
    e.printStackTrace();
}
 类似资料:
  • 问题内容: 在Java中,引发 检查 异常(Exception或其子类型- IOException,InterruptedException等)的方法必须声明 throws 语句: 不声明语句的 方法不能 引发检查的异常。 但是在Java中使用安全方法捕获检查的异常仍然合法: 其实没有 有点可笑:编译器知道 e 不是检查的异常,因此可以将其重新抛出。事情甚至有些荒谬,此代码无法编译: 第一个片段是

  • 在try块中为未抛出异常子类的方法捕获异常,将无法编译。当我捕捉到异常时,它起作用了。它是如何工作的??

  • 下面是我的代码。当我运行它时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:3、Size:2中得到异常,而不是我的异常消息。谁能解释一下我做错了什么,为什么会这样?谢谢!

  • 嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)

  • 根据JCIP第6.3.2节: Runnable是一个相当有限的抽象;run无法返回值或引发选中的异常。 无法返回值,因为其返回类型为void,但为什么不能引发选中的异常?

  • 我已经用Java编写代码一段时间了。但有时,我不知道什么时候应该抛出异常,什么时候应该捕获异常。我正在做一个有很多方法的项目。层次结构是这样的- 所以目前我正在做的是-我在所有方法中抛出异常并在方法A中捕获它,然后将其记录为错误。 但我不确定这是否是正确的方法?或者我应该开始在所有方法中捕获异常。这就是为什么这种混乱始于我的 - 我什么时候应该抓住异常与何时应该抛出异常。我知道这是一个愚蠢的问题,