34

明日の朝の最終試験に備えて行った中間期を見直しています。私はこの質問を間違えましたが、正解が指摘されておらず、教授にそれについて尋ねることを怠りました。

次のコードスニペットについて考えてみます。

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

このコードに関する次の説明のうち正しいものはどれですか?

  1. mainメソッドは、すべてのタイプの例外をキャッチして処理するように設計されています。
  2. mainメソッドは、をキャッチして処理するように設計されていFileNotFoundExceptionます。
  3. mainメソッドは、FileNotFoundException発生した場合は単に終了する必要があります。
  4. mainメソッドは、例外が発生した場合に単に終了する必要があります。

私は2番目のオプションを選択しました。

4

8 に答える 8

19

答えは4番です。

4.-例外が発生した場合、mainメソッドは単に終了する必要があります。

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を処理していないため、falseです。

同じ理由で、2番目は誤りです。

3番目は本当です。FileNotFoundExceptionがスローされると、mainメソッドは終了します。

4番目は誤りです。例外が発生しても終了しません。チェックされていない例外またはFileNotFoundExceptionの場合にのみ終了します。'throws'句で宣言された他のチェックされた例外がない場合は、それらがメソッド内で処理されていることを意味します。

于 2015-03-05T02:27:43.260 に答える
5

mainメソッドは例外をキャッチしていません。代わりにFileNotFoundException、mainメソッドを呼び出したソースにスローすることでを処理します。

システムランタイムはJVMクラスを起動し、JVMクラスの1つの特定のクラスがmainメソッドを呼び出します。

その場合、メインメソッドの処理throwsはJVMクラスに翻弄されます。

  • これについては、Oracleが提供するJava言語仕様で読むことができます。
  • さらに、そこにあるいくつかのJVMのソースコードを表示できます。そのパスをたどると、他のプログラミング言語であるOpenJdkに移動できます。

私はそのトピックで私の小さな謙虚な研究クラストを共有することを考えました、それが好奇心旺盛なものに役立つことを願っています:)

于 2014-04-24T12:00:55.123 に答える
4

質問に対する正解はオプション3であるという、他のいくつかの回答に同意します。オプション4は次のように述べています。

  1. mainメソッドは、例外が発生した場合に単に終了する必要があります。

このオプションの「any」に注意してください。main()例外が発生したが終了しないコードの例を次に示します。

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

このコードでは例外が発生しますが、この例外を処理するように設定されているため、メソッドは終了しません。もちろん、例外がキャッチされなかった場合UncheckedException、メソッドは終了します。ただし、オプション4のポイントは、「任意の」例外が発生することを示しているため、反例がそれを無効にすることです。

ただし、オプション3は、メソッドのシグニチャの例外がスローされた場合にのみ発生するようにこの終了を制限します。

  1. mainメソッドは、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. mainメソッドは、FileNotFoundException発生した場合は単に終了する必要があります。

  2. mainメソッドは、例外が発生した場合に単に終了する必要があります。

上記の両方のステートメントは、次の場合に当てはまります。

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の「すべき」という言葉は教授による不幸な選択であり、「かもしれない」のようなものがより良い選択肢だったでしょう。また、「単に終了する」(そして、間違いなく「処理する」)よりも正確な言語を使用することも良い考えでした。

于 2019-04-13T18:18:24.237 に答える
0
  1. main()最終的にはすべての未処理の例外をスローしますよね?したがって、スローを効果的に追加することFileNotFoundExceptionは冗長です。

  2. ステートメントは、メソッドが例外を処理するthrows方法については何も意味しません。このmain()メソッドは実際にを処理FileNotFoundExceptionし、それを再スローする可能性があります。

したがって、そのthrowsステートメントは、例外がどのようにキャッチおよび処理されるかについては何も示していません。また、質問3と4は、問題の例外が処理されなかったと想定した場合にのみ有効です。その仮定がなければ、質問は不確定です。その仮定で、3と4の両方が真です!

正解は、6。5年後でもこのクラスの払い戻しを学校に依頼することです。

この先生の連絡先を教えていただけませんか?彼らと一言お願いします。

于 2019-07-12T00:24:58.423 に答える
-1

この質問に対する答えはすでに選択されていますが、あなたのテストの正解は3番目だと思います。

  1. FileNotFoundExceptionが発生した場合、mainメソッドは単に終了する必要があります。

それはすべきだと言っているので、そうではありませ
つまり、メソッド内のコードは、チェックされている場合とチェックされていない場合の両方の例外をキャッチでき、それを飲み込んだり、回復したり、再スローしたりできます。または、まったくキャッチできませんでした。

しかし、最終的に(再)スローせずにキャッチした場合FileNotFoundException、それは独自のコントラクトを破っています。メソッドがそれを処理したため、呼び出し元はメソッドシグネチャに記載されている例外を認識しません(おそらくコンパイラーでさえその場合は文句を言う可能性があります) 、例外がスローされることはないと言っていますが、ここではわかりません)。

あなたの中期は、特定の実装ではなく、設計についての質問を提起していたと思います。

于 2015-03-05T03:01:28.913 に答える
-1

答えは2と3の両方です。

2.mainメソッドは、FileNotFoundExceptionをキャッチして処理するように設計されています。3. FileNotFoundExceptionが発生した場合、mainメソッドは単に終了する必要があります。

ただし、例外を処理するように設計されていて、プログラムが異常終了した場合でも、例外の処理に失敗した場合。

throwsキーワードは、処理するのが面倒な例外をJVMに処理させるために使用されます。正常にコンパイルされますが、実行時に例外が表示されます(uがmainメソッドで処理する場合、コンパイルして正常に実行されます)。

4.mainメソッドは、例外が発生した場合に単純に終了する必要があります。発生する例外はmainメソッドで処理される可能性があるため、常に正しいとは限りません。

1.mainメソッドは、すべてのタイプの例外をキャッチして処理するように設計されています。JVMはチェックされていない例外を処理しないため、正しくありません。

于 2018-06-06T09:26:06.360 に答える