34

我正在复习我为明天早上的期末考试做的期中考试。我把这个问题弄错了,但没有指出正确的答案,我忽略了向教授询问。

考虑以下代码片段:

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

下列关于此代码的陈述哪项是正确的?

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

我选择了第二个选项。

4

8 回答 8

19

答案是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

于 2012-12-08T01:05:15.633 回答
14

伙计,有点晚了,但答案是 3 号。

数字 1 是假的,因为它没有处理 FileNotFoundException

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

第 3 条是真的。如果抛出 FileNotFoundException,主方法将终止。

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

于 2015-03-05T02:27:43.260 回答
5

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

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

在这种情况下,主要方法的处理throws由 JVM 类决定。

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

我想在那个话题上分享我小小的谦虚的研究外壳,希望它对好奇的人有所帮助:)

于 2014-04-24T12:00:55.123 回答
4

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

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

请注意此选项中的“任何”。这是发生异常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

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

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

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

于 2017-04-13T13:54:39.740 回答
1

仅凭 的声明main(),不可能说哪个答案是客观正确的。根据方法的定义,任何陈述都可能是真的。

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

  2. main 方法旨在捕获和处理FileNotFoundException.

上述两种说法都适用于以下情况:

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

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

  1. 如果发生这种情况,主方法应该简单地终止FileNotFoundException

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

上述两种说法都适用于以下情况:

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

当然,我们可以根据一个体面且合理的程序员可能打算与此方法签名进行通信来猜测问题的意图。这将是他们打算让该方法 throw FileNotFoundException,并且必须处理其他 checked Exceptions。我们也可以合理地假设“处理”不仅意味着“过程”,而且特别是它不会(重新)抛出这样的异常。

这些假设立即排除了#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;
    }
}

main()在后一种情况下,#3 和 #4 都不可能为真,同时也满足将 throw的假设FileNotFoundException


总而言之,这些选项的措辞不好。如果我必须选择一个答案,那将是基于 MartinV 答案的逻辑的#3。我的假设是#3中的“应该”这个词是教授的一个不幸的选择,而像“可能”这样的词会是一个更好的选择。使用比“简单终止”(并且可以说是“处理”)更精确的语言也是一个好主意。

于 2019-04-13T18:18:24.237 回答
0
  1. main()最终抛出所有未处理的异常,对吧?因此,有效地添加 throwsFileNotFoundException是多余的。

  2. 一条throws语句没有暗示方法如何处理异常。这个main()方法确实可以处理FileNotFoundException,然后重新抛出。

因此,该throws语句没有说明任何异常是如何被捕获和处理的。并且问题 3 和 4 仅在我们假设有问题的异常未处理时才有效。没有这个假设,问题是不确定的。有了这个假设,3 和 4 都是真的!

正确的答案是要求学校为这门课退款——即使是在 6.5 年后。

可以转发一下这位老师的联系方式吗?我想和他们谈谈。

于 2019-07-12T00:24:58.423 回答
-1

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

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

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

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

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

于 2015-03-05T03:01:28.913 回答
-1

答案是 2 和 3。

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

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

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

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

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

于 2018-06-06T09:26:06.360 回答