2012-12-08 67 views
24

我正在评审我准备明天早上参加期末考试的期中考试。我把这个问题弄错了,但没有指出正确的答案,我忽略向教授询问这个问题。当main方法抛出异常时,这意味着什么?

考虑下面的代码片段:

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

以下哪项关于这个代码是正确的?

  1. 主要方法被设计用来捕获和处理所有类型的异常。
  2. 主要方法是设计用来捕获和处理FileNotFoundException
  3. 如果FileNotFoundException发生,主要方法应该简单地终止。
  4. 如果发生任何异常,主要方法应该简单地终止。

我选择了第二个选项。

回答

13

回答是4号,

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

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

检查一下测试:

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方法将终止,即使抛出的异常是不是FileNotFoundException

+1

嗯,但问题是关于'公共静态无效的主要(字串[] args)抛出FileNotFoundException异常 '签名,不是一般 – PermGenError

+1

好了,测试了一下,如果你把比'FileNotFoundException'它赢得了其他经过检查的异常不会编译。否则,如果该方法抛出一个未经检查的异常,那么它将简单地结束传播未经检查的异常。 – ElderMael

+0

嗯,真的。 +1 :) – PermGenError

2

主要方法是不要再追任何异常,而是通过将它引发到调用main方法的源来处理FileNotFoundException

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

的处理为主要方法的throws是在这种情况下,JVM类的摆布。

  • 您可以在Oracle提供的Java language specification中阅读它。
  • 此外,您可以查看源代码的一些可用在那里的的JVM,去这条道路虽然你走以其他编程语言,OpenJdk

我想到的是主题分享我的小谦卑研究地壳,希望它可以帮助那些好奇:)

8

哥们,有点晚了,但答案是3号。

1号是假的,因为它不处理FileNotFoundException异常

2号是出于同样的原因假。

数字3为真。如果抛出FileNotFoundException,则主方法将终止。

4号是错误的。它不会在任何异常情况下终止。它只会在未经检查的异常或FileNotFoundException时终止。如果'throws'子句中没有声明其他检查过的异常,则表示它们正在该方法内处理。

+0

这个答案显然是错误的。为什么这里没有任何评论或者反对票?只有在没有任何'try-catch'语句的情况下'throws'的方法将不会处理这些异常。 – user3437460

+0

我认为这个练习的目的是想象主要方法中的内容。我同意它留下含糊不清和假设的余地。但是,因为它抛出FileNotFoundException异常,我假定正在处理任何其他检查异常(使用try-catch)。另外我假设它不处理未经检查的异常。 – MartinV

-1

虽然答案已经选择了这个问题,我认为正确的答案,你的测试号3:

  • 主要方法应该简单地终止,如果发生FileNotFoundException。
  • 因为它说:应该,不
    我的意思是,方法中的代码可以捕获任何异常,既可以选中也可以不选中,并且可以吞咽,恢复或重新抛出异常,或者它根本无法捕获它们。

    但是,如果它在没有最终(重新)抛出它的情况下捕获FileNotFoundException,它将破坏它自己的合约:任何调用者都不会在方法签名中看到异常,因为该方法处理它(甚至可能是编译器在这种情况下可以投诉,说这个例外从未抛出,但我不确定)。

    我认为你的期中期提出了一个关于设计的问题,而不是一个具体的实现。

    1

    我一些其他的答案一致认为的正确答案的问题是,选项3选项4说:

  • 主要方法应该简单地终止,如果发生任何异常。
  • 请注意此选项中的“任何”。下面是其中发生异常的代码示例,但main()不会终止:

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

    在这段代码中发生异常,但该方法不会终止,因为它已经建立,以处理这个异常。如果这个例外是未被捕获的UncheckedException,那么该方法当然会终止。然而,选项4的意义在于,任何反例都会使其无效,因为它表示出现“任何”异常。

    选项3,但是,限制了这种终止于仅当在方法的签名抛出异常发生:

  • 如果发生FileNotFoundException主要方法应该简单地终止。
  • 之所以选择3更有意义,因为类似于下面的代码是没有意义的实践:

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

    它没有太大的意义来声明一个方法抛出一个异常,但在方法中捕获该异常(除非可能在执行某些操作后重新抛出它,在这种情况下,方法3仍然存在,因为方法最终终止)。

    相关问题