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

时间:2012-12-08 00:56:47

标签: java exception

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

请考虑以下代码段:

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

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

  1. 主要方法旨在捕获和处理所有类型的异常。
  2. 主要方法旨在捕获和处理FileNotFoundException
  3. 如果发生FileNotFoundException,主要方法应该终止。
  4. 如果发生任何异常,主要方法应该终止。
  5. 我选择了第二个选项。

8 个答案:

答案 0 :(得分:17)

答案是第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");
    }
}

正如您所看到的,如果我抛出RuntimeException,即使抛出的异常不是FileNotFoundException

,该方法也会终止

答案 1 :(得分:10)

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

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

出于同样的原因,数字2是假的。

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

4号是假的。如果出现任何异常,它不会终止。它仅在未经检查的异常或FileNotFoundException的情况下终止。如果在' throws'中没有声明其他已检查的异常。这意味着他们正在方法中处理。

答案 2 :(得分:3)

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

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

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

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

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

答案 3 :(得分:2)

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

  
      
  1. 如果发生任何异常,主要方法应该终止。
  2.   

注意"任何"在这个选项中。以下是发生异常的代码示例,但main()未终止:

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

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

但是,选项3将此终止限制为仅在抛出方法签名中的异常时才会发生:

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

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

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

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

答案 4 :(得分:0)

仅使用main()的声明,就不可能说出客观上正确的答案。取决于方法的定义,任何一种说法都可能是正确的。

  
      
  1. main方法旨在捕获和处理所有类型的异常。

  2.   
  3. 主要方法旨在捕获和处理FileNotFoundException

  4.   

以上两种说法均符合以下情况:

public static void main(String[] args) throws FileNotFoundException {
    while (true) {
        try {
            doSomething();
        }
        catch (Exception e) {}
    }
}

main()永远不会抛出声明的异常,但这不是错误;只是毫无意义和误导。

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

  2.   
  3. 如果发生任何异常,main方法应该简单地终止。

  4.   

以上两种说法均符合以下情况:

public static void main(String[] args) throws FileNotFoundException {
    try {
        doSomething();
    }
    catch (Exception e) {
        return;
    }
} 

当然,我们可以根据体面和合理的程序员打算与此方法签名进行通信的内容来猜测问题的意图。那就是他们打算让该方法抛出FileNotFoundException,并必须处理其他选中的Exception。我们还可以合理地假设“句柄”不仅仅意味着“过程”,而且具体地讲它不会(重新)抛出这种异常。

这些假设立即排除了#1和#2。

剩下的问题是“简单终止”是否包含引发异常,还是仅包含显式的return / System.exit()。在前一种情况下,#3和#4仍然可能是正确的:

public static void main(String[] args) throws FileNotFoundException {
    try {
        doSomething();
    }
    catch (FileNotFoundException fnfe) {
        throw fnfe;
    }
    catch (Exception e) {
        return;
    }
}

在后一种情况下,#3和#4都不是正确的,同时还满足main()将抛出FileNotFoundException的假设。


总而言之,这些选项的用词不正确。如果我必须选择一个答案,那么根据MartinV的回答逻辑,它将是#3。我的假设是#3中的“应该”一词是教授的不幸选择,而“可能”之类的词本来会更好。使用比“简单终止”(也可以说“句柄”)更精确的语言也是一个好主意。

答案 5 :(得分:-1)

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

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

因为它说应该,而不是 我的意思是,方法中的代码可以捕获任何异常,包括已检查和未检查的异常,然后吞下,恢复或重新抛出它 - 或者它根本无法捕获它们。

但是如果它在没有最终(重新)抛出它的情况下捕获FileNotFoundException,它就会违反自己的合同:任何调用者都不会看到方法签名中所述的异常,因为该方法处理了它(甚至编译器可能会抱怨这种情况,说永远不会抛出异常,但我不确定)。

我认为你的中期问题是关于设计的问题,而不是特定的实施问题。

答案 6 :(得分:-1)

答案是2& 3。

2. main方法旨在捕获和处理FileNotFoundException。  3.如果发生FileNotFoundException,主要方法应该终止。

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

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

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

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

答案 7 :(得分:-1)

  1. [ {owner: 123, prop: 111 }, {owner: 123, prop: 222 } ... ] --> [111, 222] 最终会引发所有未处理的异常,对吗?因此,有效地添加抛出main()是多余的。

  2. FileNotFoundException语句对方法如何处理异常没有任何暗示。此throws方法确实可以处理main(),然后将其重新抛出。

因此,FileNotFoundException语句对任何异常的捕获和处理方式都不表示任何意义。问题3和问题4仅在我们假设所处理的异常未得到处理时才有效。没有这个假设,问题是不确定的。按照这种假设,3和4都是正确的!

正确的答案是要求学校退还这门课,甚至是6.5年后。

能否请您转发此老师的联系信息?我想和他们谈谈。