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

JDK1.7以后,从catch块抛出异常对象不需要抛出子句!!!为什么会这样呢?[副本]

刁文光
2023-03-14
public class ExceptionTest {

    public void test() {
        try
        {
            // Some code which may throw exception.
        }
        catch(Exception ex)
        {
            // Compiler should ask me to have a *throws Exception* in the signature, when I am throwing an exception object.
            throw ex;
        }
    }

}

注:我在Java7或8中运行时就面临这种情况。

我在想,抛出的物体要去哪里?对此有任何想法的人请...

共有1个答案

慕容昊焜
2023-03-14

如果try块中的代码不能抛出任何已检查的异常,您将看到这一点。此时,编译器知道catch块捕获的唯一类型的异常必须是未经检查的异常,因此可以重新抛出它。请注意,如果您在catch块中为ex分配了不同的值,编译器将不再能够得到这种保证。目前,ex实际上是最终的。

如果尝试调用声明为在try块内抛出检查异常的内容,则代码将无法按预期编译。

例如:

public class ExceptionTest {

    public void test() {
        try {
            foo();
        } catch(Exception ex) {
            throw ex;
        }
    }

    public void foo() throws java.io.IOException {
    }
}

给出的误差为:

ExceptionTest.java:12: error: unreported exception IOException; must be caught or declared to be thrown
        throw ex;
        ^

至于异常的“去向”--如果try块中的代码抛出一个未经检查的异常,它就会像正常一样传播。试试看:

public class ExceptionTest {

    public static void main(String[] args) {
        test();
    }

    public static void test() {
        try {
            String x = null;
            x.length();
        } catch(Exception ex) {
            throw ex;
        }
    }
}

运行该操作会得到以下输出(如预期的):

Exception in thread "main" java.lang.NullPointerException
        at ExceptionTest.test(ExceptionTest.java:10)
        at ExceptionTest.main(ExceptionTest.java:4)
 类似资料:
  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

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

  • 问题内容: 如果catch和finally块都抛出异常会怎样? 问题答案: 当该块引发异常时,它将有效地隐藏从该块引发的异常,并将最终引发该异常。因此,重要的是要么在捕获时记录异常,要么确保finally块本身不会引发异常,否则,您将得到被扼杀且从未见过的异常​​。

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 针对每个循环处理跳过迭代的控件的问题,我发现允许在不断变化的集合上进行迭代: 例如,以下内容: 投掷 InvalidOperationException:集合已修改;枚举操作可能无法执行。 然而,在a。Net窗体,您可以执行以下操作: 它跳过元素,因为迭代器运行在更改的集合上,而不会引发异常 错误?如果基础集合发生变化,迭代器是否需要抛出? 所以我的问题是为什么对不断变化的的迭代不会抛出Inval

  • 下面是我的代码: 现在我的脑海中应该不会出现不匹配,因为显然提取了两个整数?!