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

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

请考虑以下代码段:

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

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

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

我选择了第二个选项。

答案是4号,

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

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

检查此测试:

 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"); } } 

如您所见,如果我抛出RuntimeException ,即使抛出的exception不是FileNotFoundException该方法也会终止

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

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

由于同样的原因,2号是假的。

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

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

main方法没有捕获任何exception,而是通过将其抛出到调用main方法的源来处理FileNotFoundException

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

在这种情况下,对主方法的throws的处理受JVM类的支配。

  • 您可以在Oracle提供的Java语言规范中阅读它。
  • 另外,您可以查看那里可用的一些JVM的源代码,然后通过该路径将您带到其他编程语言OpenJdk 。

我想在这个话题中分享我的小谦卑的研究shell,希望它有助于好奇的:)

我同意其他一些答案,即问题的正确答案是选项3.选项4说:

  1. 如果发生任何exception,主要方法应该简单地终止。

请注意此选项中的“任何”。 这是一个发生exception的代码示例,但main()不会终止:

 public static void main(String[] args) throws FileNotFoundException { try { methodThatThrowsACheckedException(); } catch (SomeCheckedException e) { // do something to handle this exception } } 

在此代码中发生exception,但该方法不会终止,因为它已设置为处理此exception。 如果exception是未被捕获的UncheckedException ,那么该方法当然会终止。 但是,选项4的要点是,任何反例都会使它失效,因为它表示发生了“任何”exception。

但是,选项3仅在抛出方法签名中的exception时才会限制此终止:

  1. 如果发生FileNotFoundException ,主要方法应该简单地终止。

选项3更有意义的原因是因为以下代码在实践中没有意义:

 public static void main(String[] args) throws FileNotFoundException { try { methodThatThrowsFileNotFoundException(); } catch (FileNotFoundException e) { // do something to handle this exception } } 

声明方法抛出exception没有多大意义,但是在方法中捕获该exception(除非你在做某事之后重新抛出它,在这种情况下,选项3仍然存在,因为该方法最终终止)。

答案是2和3。

2.主要方法用于捕获和处理FileNotFoundException。 3.如果发生FileNotFoundException,主方法应该简单地终止。

但是如果无法处理exception,即使它被设计为处理它并且程序exception终止。

throws关键字用于使JVM处理我们懒惰处理的exception,它成功编译但在运行时显示exception(如果你在main方法中处理它然后编译并成功运行)。

4.如果发生任何exception,主要方法应该简单地终止。 不正确总是因为发生的exception可能在main方法中处理。

1. main方法旨在捕获和处理所有类型的exception。这是不正确的,因为JVM不处理未经检查的exception。

虽然已经为这个问题选择了答案,但我认为您的测试的正确答案是第3项:

  1. 如果发生FileNotFoundException,主要方法应该简单地终止。

因为它说应该 ,不会。
我的意思是,该方法中的代码可以捕获任何exception,包括已检查和未检查,以及吞咽,恢复或重新抛出它 – 或者它根本无法捕获它们。

但是如果它捕获FileNotFoundException而没有最终(重新)抛出它,它就会破坏它自己的契约:任何调用者都不会看到方法签名中所述的exception,因为该方法处理它(甚至编译器可能会抱怨它案例,说永远不会抛出exception,但我不确定这里)。

我认为你的中期问题是关于设计而不是具体实施的问题。