3
import java.io.*;
class ex3
{

    public static void main(String args[])
    {
       myfun();
    }

    static void myfun()
    {
        try
        {
           FileInputStream f = new FileInputStream("file.ytxt");
           System.out.println("my fun");
        }

        catch(Exception e) //Line 1
        {
           System.out.println(e.getMessage());
        }

        catch(FileNotFoundException e) //Line 2
        {
           System.out.println("File Not Found Caught");
        }
    }
}

2 つの例外ハンドラー コードを作成しました (1 行目と 2 行目に汎用コードと固有コードがあります)。

私のコンパイラは不平を言っています

ex3.java:24: error: exception FileNotFoundException has already been caught
                catch(FileNotFoundException e)
                ^
1 error

私の質問は、「FileNotFoundException」が try ブロックによってスローされることをコンパイラがどのように認識したかです。

4

10 に答える 10

10

catch(FileNotFoundException e)この行には到達できません。以来:

FileNotFoundException extends Exception

ExceptionおよびFileNotFoundExceptionを参照してください。

ここに画像の説明を入力

おそらく、順序を入れ替えたいと思うでしょう。

于 2013-08-21T13:27:42.900 に答える
6

あなたの問題は別の場所にあります。これはすべての例外の基底クラスでFileNotFoundExceptionあるため、常に にキャッチされます。Exceptionしたがって、コンパイラは基本的にデッドコードの一部について不平を言います。

catch(FileNotFoundException e) {
    System.out.println("File Not Found Caught");
}

一般に、をキャッチするのは得策ではありません。Exceptionよりきめの細かい expcetion 処理を常に行うようにしてください。そのため、これを削除してそこにFileNotFoundExceptionブロックを残してください。

于 2013-08-21T13:28:31.767 に答える
4

コンパイラは、この例外が前の catch ブロックによって既にキャッチされていることを確認できます。

をキャッチするExceptionと、 などの Exception のサブクラスもキャッチされFileNotFoundExceptionます。

catch ブロックの順序を次のように入れ替えます。

    catch(FileNotFoundException e) //Line 2
    {
        System.out.println("File Not Found Caught");
    }
    catch(Exception e) //Line 1
    {
        System.out.println(e.getMessage());
    }
于 2013-08-21T13:27:33.177 に答える
1
catch(Exception e) 
    {
       System.out.println(e.getMessage());
    }

    catch(FileNotFoundException e) 
    {
       System.out.println("File Not Found Caught");
    }

Exception は、すべての例外のスーパー クラスです。

したがって、catch(Exception e){} を使用している場合、すべてのタイプの例外をキャッチできます。

そのため、catch(FileNotFoundExecption f){} に到達できないため、コンパイラは既にキャッチされているというエラーを返します。

これは正しい書き方です:

    catch(FileNotFoundException e) 
    {
       System.out.println("File Not Found Caught");
    }
    catch(Exception e) 
    {
       System.out.println(e.getMessage());
    }
于 2013-08-21T14:55:10.670 に答える
1

これを変える -

    catch(Exception e) //Line 1
    {
        System.out.println(e.getMessage());
    }

    catch(FileNotFoundException e) //Line 2
    {
        System.out.println("File Not Found Caught");
    }

これに -

    catch(FileNotFoundException e) //Line 1
    {
        System.out.println(e.getMessage());
    }
    catch(Exception e) //Line 2
    {
        System.out.println("File Not Found Caught");
    }

ExceptionJava のすべての例外クラスのスーパー タイプです。したがって、任意の例外オブジェクトを type の参照に割り当てることができますException。プログラムで例外が発生すると、catch ブロックが上から下に順番に調べられ、発生した例外のタイプとcatchブロックが処理している例外のタイプとの一致が検出されます。その結果、try ブロック内で生成されたどのタイプの例外でも、常に最初の catch ブロックが一致として検出され、コードから 2 番目の catch ブロックに到達することはありません。これがまさにコンパイラが不平を言っている理由です。

于 2013-08-21T13:29:09.463 に答える
0

Java 仮想マシンの仕様: 例外

Java 仮想マシンの各メソッドは、0 個以上の例外ハンドラに関連付けることができます。例外ハンドラは、例外ハンドラがアクティブなメソッドを実装する Java 仮想マシン コードへのオフセットの範囲を指定し、例外ハンドラが処理できる例外のタイプを記述し、処理するコードの場所を指定します。その例外。例外の原因となった命令のオフセットが例外ハンドラのオフセットの範囲内にあり、例外タイプが例外ハンドラが処理する例外のクラスと同じクラスまたはそのサブクラスである場合、例外は例外ハンドラに一致します。例外がスローされると、Java 仮想マシンは現在のメソッドで一致する例外ハンドラを検索します。一致する例外ハンドラが見つかった場合、

メソッドの例外ハンドラが一致するかどうかを検索する順序は重要です。クラス ファイル内では、各メソッドの例外ハンドラがテーブルに格納されます (§4.7.3)。実行時に例外がスローされると、Java 仮想マシンは、現在のメソッドの例外ハンドラを、クラス ファイル内の対応する例外ハンドラ テーブルに表示される順序で、そのテーブルの先頭から検索します。

JDK がそのようなコードをコンパイルすると、FileNotFoundException ブロックに到達できなくなります。例外オブジェクトは に対してチェックされるため、instanceof常に最初の Exception ブロックに分類されます。あなたの場合、正しい表は次のようになります。

  Exception table:
   from   to  target type
     0    18    21   Class java/io/FileNotFoundException
     0    18    33   Class java/lang/Exception

fromto命令番号です。テーブルはトップダウンで検索されます。

于 2013-08-21T18:40:41.950 に答える
0

これはポイントではありません。つまり、catch(Exception e)any もキャッチします。したがって、もう一度キャッチしても意味がありません。ExceptionFileNotFoundExceptionFileNotFoundException

最初にキャッチFileNotFoundExceptionし、次にException.

于 2013-08-21T13:29:14.410 に答える