当main方法抛出exception时,它意味着什么?
我正在审查我为明天上午的期末考试做准备的期中考试。 我错了这个问题,但是没有正确的答案指出,我忽略了向教授询问它。
请考虑以下代码段:
public static void main(String[] args) throws FileNotFoundException
关于此代码的以下哪些陈述是正确的?
- main方法旨在捕获和处理所有类型的exception。
- main方法旨在捕获和处理
FileNotFoundException
。 - 如果发生
FileNotFoundException
,主要方法应该简单地终止。 - 如果发生任何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说:
- 如果发生任何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时才会限制此终止:
- 如果发生
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项:
- 如果发生FileNotFoundException,主要方法应该简单地终止。
因为它说应该 ,不会。
我的意思是,该方法中的代码可以捕获任何exception,包括已检查和未检查,以及吞咽,恢复或重新抛出它 – 或者它根本无法捕获它们。
但是如果它捕获FileNotFoundException
而没有最终(重新)抛出它,它就会破坏它自己的契约:任何调用者都不会看到方法签名中所述的exception,因为该方法处理它(甚至编译器可能会抱怨它案例,说永远不会抛出exception,但我不确定这里)。
我认为你的中期问题是关于设计而不是具体实施的问题。