3

どちらを優先する必要がありますか?例:

class Example {
    int[] A = new A[5];

    void setArray(int item, int index) {
        if(index < 0 || index >= 5) {
            System.out.println("Index out of bounds");
        } else {
            A[index] = item;
        }
    }
}

またはこれ?

class Example {
    int[] A = new A[5];

    void setArray(int item, int index) {
        try {
            A[index] = item;
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Index out of bounds");
        }
    }
}
4

3 に答える 3

3

言語が例外を適切にサポートしている場合(C#やJavaのように)、例外をスローしてキャッチすることが、例外ケースを処理する最も一般的な方法です。

その理由は、コードのロジックが明確になるためです。メソッドは一般的なケース用に記述でき(エラーコードなどを解決する手間をかけずに)、実際には異常なケースを処理するのに十分なコンテキストを持つ少数のメソッドのみに、そうするためのコード。

あなたの例は、それが起こったのと同じレベルで例外をキャッチしたので、私が言っていることを示していません。実際には、例外は数レベル上にスローされるため便利です。例外の一部はプログラムの最上位レベル近くに到達し、後でそのレベルによって呼び出される予定だったすべてのメソッドを中止します。

以下の説明は、例外が適切に使用されている場合の例外の重要性に光を当てることを願っています。

まず、エラーメッセージarray index out of boundsがユーザーにとって無意味であると考えてください。配列が範囲外でアクセスされたという事実から(プログラムによって)推測されたとしても、1つのメッセージなど、別の種類のエラーメッセージを表示するだけでもthe file being read has an incorrect formatはるかに便利です。ただし、配列のメソッドでエラーメッセージを変更するだけではset意味がありません。配列は多くの目的で使用され、範囲外のインデックス作成の試行はさまざまな意味を持ちます(方法によって異なります)。フローがそこに到達しました)。呼び出し元の階層で十分に高いメソッドのみが、各種類の例外が実際に何を意味するかを知っています。

第2に、例外を数レベル上に移動させることで、プログラムは問題についてより適切に推論し、場合によってはユーザーをまったく気にせずに別のアクションを試すことができます。

第3に、例外をキャッチしてこのような低レベルでエラーメッセージを表示しても、呼び出し元のメソッドは例外が発生したことをまったく認識しません。これは、プログラムの上位レベルのロジックが、これまでのすべての操作が成功したと考えて、何も起こらなかったかのように通常のフローを継続することを意味します。これは一種の間違った動作であり、比較的無害なものから破壊的なものまでさまざまです。

したがって、質問に答えるには、通常、質問の特定の例に対する正しい(実用的な)アプローチは単純です。

void setArray(int item, int index) {
    A[index] = item;
}

そして、より高いレベルで例外を処理する必要があります。そのような場合に何をすべきかを決定する一般的な方法が必要な場合は、ここで私の答えを読んでください

于 2013-01-21T08:12:25.340 に答える
2

ArrayIndexOutOfBoundsException実行時の例外です。

入力をサニタイズする最初のコードスニペットにを投げるIllegalArgumentException方が理にかなっています。

于 2013-01-21T07:59:37.683 に答える
1

例外、特にチェックされていないものは、例外的な場合です。障害のポイントを予測できる場合は、入力を自分で検証してください。私の唯一の例外はNumberFormatException、これは明らかに自分自身を検証するのが難しいためです。

チェックされていない例外は、APIユーザーがおそらく回復できない場合に使用されることを意図していますが、この場合は明らかに回復できます。

于 2013-01-21T08:00:29.613 に答える