1

Javaで初めて例外を処理していますが、これが良い方法かどうかを知りたいです。

public static void main(String[] args) throws FileNotFoundException {
        submethod();        
    }


    static void submethod() throws FileNotFoundException {
        Scanner scan = new Scanner(new File("file.txt"));

        while (scan.hasNextLine()) {
            // do somethig...
        }
    }

私にとって奇妙に聞こえるのはthrows FileNotFoundException、メソッド内でも明示的な宣言が行われているmainことです。それ以外の場合、コンパイラは次のように報告します。

error: unreported exception FileNotFoundException; must be caught or declared to be thrown

私のやり方が間違っているのか知りたかったのです。より多くの例外をキャッチする必要がある、より複雑なプロジェクトでは、非常に面倒になります。これは例外を処理するためのより良い方法ですか? そして、なぜ両方のメソッドで宣言する必要があるのですか?

4

3 に答える 3

2

はチェック済み例外であるためFileNotFoundExceptionthrows節での指定が必要です。FileNotFoundExceptionもう 1 つのオプションは、例外をキャッチし、try-catch.

例外の処理方法を決定するのは、プログラムの要件次第です。たとえば、例外がスローされたときに特定のエラー メッセージを出力する場合は、それをキャッチできます。

try {
    Scanner scan = new Scanner(new File("file.txt"));

    while (scan.hasNextLine()) {
        // do somethig...
    }
} catch(FileNotFoundException ex) {
    System.err.println("file.txt was not found");
}

ただし、あなたが持っているような単純なケースでは、例外が発生したときにプログラムを終了するのが理にかなっています. したがって、先ほど行ったように、メソッドを宣言して例外をスローすることができます。

より複雑なシナリオでは、例外をキャッチし、ユーザーに何かを出力して、プログラムを続行することができます。たとえばsubmethod、ユーザーが提供したファイルを読み取るためだけに を使用する場合は、throwsをそのままにしておくことができます。ただし、メソッドの呼び出し元は、例外がスローされた場合に例外を処理し、ユーザーに別のファイル名を再入力するように求める場合があります。

于 2014-12-08T18:26:19.713 に答える
0

このように扱ってはいけません。どこかでエラーをキャッチし、例外を処理する必要があります。submethod() でエラーをキャッチするか、メイン メソッドでエラーをキャッチして例外を処理する必要があります。現在の方法では、エラーをスタックにスローするだけのエラー処理はありません。例:

static void submethod() {
    try
    {
        Scanner scan = new Scanner(new File("file.txt"));

         while (scan.hasNextLine()) {
            // do somethig...
         }
    }catch(FileNotFoundException e)
    {
        e.printStackTrace();
        //error handling here
    }
}

または:

public static void main(String[] args) {
    try
    {
         submethod();
    }catch(FileNotFoundException e)
    {
         e.printStackTrace();
         //error handling code here
    }        
}

2 番目のケースでは、submethod() で FileNotFoundException をスローします。サブメソッドに throws 宣言を残しますが、そこで処理するメインメソッドには残しません。

于 2014-12-08T18:24:28.230 に答える
0

あなたの submethod() は FileNotFoundExceptionm 例外を処理していないためです。メソッドの呼び出し元は、メソッド呼び出しを try catch ブロックで囲むか、メイン メソッドにスローを追加することによって、この例外を処理する必要があります。

于 2014-12-08T18:25:27.800 に答える