当main方法抛出异常时,它意味着什么?

age*_*154 30 java exception

我正在审查我为明天上午的期末考试做准备的期中考试.我错了这个问题,但是没有正确的答案指出,我忽略了向教授询问它.

请考虑以下代码段:

public static void main(String[] args) throws FileNotFoundException
Run Code Online (Sandbox Code Playgroud)

关于此代码的以下哪些陈述是正确的?

  1. main方法旨在捕获和处理所有类型的异常.
  2. 主要方法是捕捉和处理FileNotFoundException.
  3. 如果FileNotFoundException发生,主要方法应该简单地终止.
  4. 如果发生任何异常,主要方法应该简单地终止.

我选择了第二个选项.

Eld*_*ael 18

答案是4号,

4.-如果发生任何异常,主要方法应该简单地终止.

throws子句仅声明该方法抛出已检查的FileNotFoundException,并且调用方法应捕获或重新抛出它.如果在main方法中抛出(而不是catch)未检查的异常,它也将终止.

检查此测试:

public class ExceptionThrownTest {

    @Test
    public void testingExceptions() {

        try {
            ExceptionThrownTest.main(new String[] {});
        } catch (Throwable e) {
            assertTrue(e instanceof RuntimeException);
        }

    }

    public static void main(String[] args) throws FileNotFoundException {

        dangerousMethod();

        // Won't be executed because RuntimeException thrown
        unreachableMethod();

    }

    private static void dangerousMethod() {
        throw new RuntimeException();
    }

    private static void unreachableMethod() {
        System.out.println("Won't execute");
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,如果我抛出一个RuntimeException方法将终止,即使抛出的异常不是一个FileNotFoundException

  • 好吧,测试一下,如果抛出除“FileNotFoundException”之外的已检查异常,它将无法编译。否则,如果该方法抛出未经检查的异常,那么它将简单地结束传播未经检查的异常。 (3认同)
  • 嗯,但是问题是关于`public static void main(String [] args)抛出FileNotFoundException`签名,而不是一般 (2认同)
  • 选项 4 在逻辑上暗示了选项 3,因此如果选项 3 不正确,则选项 4 不可能是正确的。如果发生任何异常都会发生 X,那么如果发生“FileNotFoundException”,X 也会发生,因为“FileNotFoundException”是一个异常。 (2认同)

Mar*_*inV 12

老兄,有点晚了,但回答是3号.

数字1为false,因为它没有处理FileNotFoundException

由于同样的原因,数字2是错误的.

3号是真的.如果抛出FileNotFoundException,则main方法将终止.

4号是假的.如果出现任何异常,它不会终止.它仅在未经检查的异常或FileNotFoundException的情况下终止.如果'throws'子句中没有声明其他已检查的异常,则表示它们正在该方法中处理.

  • 这个答案显然是错误的。为什么对此没有任何评论或反对票?一个只有 `throws` 没有任何 `try-catch` 语句的方法将***不***处理异常。 (2认同)
  • 我认为这个练习的目的是想象 main 方法里面有什么。我同意它为模棱两可和假设留下了空间。但是,由于它抛出 FileNotFoundException,我假设正在处理任何其他已检查的异常(使用 try-catch)。另外我认为它没有处理未经检查的异常。 (2认同)

E_X*_*E_X 5

main 方法不会捕获任何异常,而是FileNotFoundException通过将其抛出到调用 main 方法的源来处理。

系统运行时启动 JVM 类,JVM 类中的一个特定类调用 main 方法。

throws在这种情况下,主要方法的处理受 JV​​M 类的支配。

  • 您可以在Oracle 提供的Java 语言规范中阅读它。
  • 此外,您可以查看一些可用的 JVM 的源代码,虽然走这条路会带您到其他编程语言OpenJdk

我想在那个话题上分享我那小小的卑微的研究外壳,希望它能帮助好奇的人:)