10

これについてできることはすべて読みましたが、チェック済み例外とチェックなし例外の使用方法をまだ理解していません。まだまだコンセプトが理解できていないと思います。チェックされた例外ではなくチェックされていない例外を使用する方が良いことを StackOverflow で読みましたが、Eclipse では、次のようにチェックされた例外を使用するように強制FileNotFoundExceptionされます(私の知る限り、Eclipse が try/catch ブロックを挿入するように強制する場合、それはチェックされた例外です)。チェックされているものをチェックされていないものに変換する方法はありますか?一体何を扱っているのですか?例外を処理するとはどういうことかわかりません。

ここにこの例があります。これを処理する方法 (?) を本当に知りたいです。これはチェック例外ですよね?

public void readFile() {
    File foo = new File("./foo.bar");
    try {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(foo));
    } catch (FileNotFoundException e) {
        // What should I do here?
    }
    getDataFromFile(bufferedReader);
}

私は人々がここでしていることをいろいろ見てきました。スタックトレースを出力する人もいますが、それは私が通常行っていることであり、問​​題はありません。デバッグに必要な情報が得られます。それらを無視する人もいますが、それはすべきではないと思います (JNode OS ブーターが例外を無視しているのを見ました)。throws一部の人々は、署名に宣言を追加するだけです。その中にさらに例外をスローする人もいます! (多分これは、チェックされた手段の代わりにチェックされていないものを使用することだと思いますか?)

さらに、throws宣言を追加すると、try/catch ブロックをさらに上に置く必要があり、非常に大きなアプリケーションの場合は不便です。申し訳ありませんが、私は単に無知です。完全に。私は優れたエレガントなデザインを学ぼうとしていますが、これは私を苦しめています.

4

4 に答える 4

6

未チェックの例外

そもそも発生してはならないことによる例外であり、したがって予期することはできません。プログラムにバグがある場合にのみ発生するケースを処理します。

これはRuntimeException(のサブクラスである) のサブクラスでありException、通常はIllegalArgumentExceptionNullPointerException、またはを使用して実装されます。IllegalStateException

未チェックの実行時例外は、一般に、プログラムのロジックのエラーを反映しており、実行時に合理的に回復できない状態を表します。


チェック例外

システムの他の部分で予期せぬ状況が発生したため、発生する可能性があります。それはあなたの直接の管理外ですが、必ずしもバグではありませんが、遭遇する可能性のあるケースです.

のサブクラスですException

差出人: 例外


あなたの例では、

ファイルが存在しない場合は、特定の条件 (ディスクがいっぱい) が優先される場合に、製品コードであっても発生する可能性があるため、処理する必要があります。それはそれをチェックされた例外にします。


例外の処理:

例外は、より良いユーザー エクスペリエンスを提供することを目的としています。そのため、ユーザーにエラーを報告し、続行できない場合は正常に終了する必要があります。

  1. 予想していたケースである場合は、おそらくユーザーに問題を通知し、必要に応じて正常に終了するか、次の作業に進む必要があります。

  2. それがチェックされていない例外である場合、予期しないエラーが発生したことをユーザーに伝え、スタックトレースを報告してもらうことが最善の方法です。

于 2012-11-11T17:13:17.340 に答える
1

チェックされた例外はお尻の痛みです。

このような率直な言葉を使って申し訳ありませんが、これは Java の最悪の設計ミスの 1 つです。Eclipse や Java 独自の API など、チェック済み例外をまだ使用しているレガシー API を処理する必要がある場合、私が個人的に行っているのは、それらを独自の未チェック例外にラップすることです。独自のタグ付けクラスを使用することをお勧めします。これにより、これらの例外が、たとえばログ ファイルやデバッグ時にコードが原因であると認識することができます。

個人的には、タグ付けクラスを呼び出すことに非常に満足しているBullshitFreeため、次のようにチェック済み例外を再スローできます

try {
    // call to legacy API that still uses checked exceptions
} catch(CheckedException exception) {
    throw new BullshitFree(exception);
}

チェックされないように、BullshitFree例外クラスが実際に拡張されていることを確認してください。RuntimeException

コード例の場合、2 つのオプションがあります。ファイルを作成するか、ユーザーにエラーを報告するなど、この問題から回復する方法がある場合は、そのようにしてください。そうでない場合、または自分で使用している小さなスクリプトにすぎない場合は、それをBullshitFree例外でラップし、Ruby または適切に設計された別の言語の学習に 1 日を費やしてください。</p>

マイレージは異なる場合があります。

于 2012-11-23T09:36:58.870 に答える
1

まず、例外はあなたの友人です:)-いいえ、本当に。例外は、エラー処理のための非常に強力で安全な方法です。

基本的に、Java でのチェック済み例外とチェックなし例外の違いは、例外に対する意図された反応です。

チェック例外は、通常、操作のある種の「予期しない」結果を呼び出し元に伝えるために使用されます。呼び出し元は、その例外状態を明示的に処理したいと考えられています。

通常、チェックされていない例外は、多かれ少なかれ回復不能であると見なされる例外です。これは、操作全体を無効にすると想定される障害状態を示すために使用されます。これらの例外と同様に、NullPointerExceptionほぼすべての操作で多かれ少なかれ潜在的です。それらをチェックすることは、呼び出し元が行う必要があるエラー処理の厄介なオーバーヘッドを意味します。

あなたの例では、おそらく次のようになります。

public void readFile() {
    File foo = new File("./foo.bar");
    try {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(foo));
        getDataFromFile(bufferedReader);  // If the file could not be found above, this will never execute!
    } catch (IOException e) {
        // React, e.g.:
        System.out.println("Data could not be read due to an IO error.");
    }

}

例外を再スローしたり、ある例外を別の例外でラップしたりすることは珍しくありません。- たとえば、IOExceptionストライキが発生した場合、例外をそのまま渡すか、呼び出し元に修正して例外を適切な方法で処理できるようにする前に、クリーンアップを実行したり、開いているファイルを閉じたりすることができます。

特定の例外を実際にどのように処理するかは、ほぼ完全にあなた次第です。コードを実行するユーザー (自分自身など) と環境によっては、スタックトレースを出力しても問題ない場合があります。または、一時停止した後で、行ったことを再試行したい場合もあります。または、上記の例では、ユーザーにメッセージを表示して、ファイル名 &c を再入力するように依頼することもできます。

ちなみに、後者は、さまざまなクラスの例外を効果的に使用できるものです。FileNotFoundException(のサブクラスであるIOException) A は、ユーザーの操作によって回復可能です。ベアIOExceptionは、最悪の場合、何らかのハードウェア障害を示している可能性があるため、回復不能と見なされる可能性があります。

于 2012-11-11T17:28:43.617 に答える
1

あなたの例(変更された)自体を説明してみましょう。

public void readFile() {
    BufferedReader bufferedReader = null;
    try {
            File foo = new File("./foo.bar");
        bufferedReader = new BufferedReader(new FileReader(foo));
    } catch (FileNotFoundException e) {
        // What should I do here?
    }
    getDataFromFile(bufferedReader);
}

例外がFileNotFoundException発生すると、bufferedReader はファイル ストリームで初期化されません。getDataFromFile(bufferedReader);その場合、データを読み取る bufferedReader がないため、次のステートメントは失敗します。

したがって、catchブロックでは、次の 2 つのうちのいずれかを行うことができます。

  1. 新しいカスタム例外をスローしてプログラムから戻る
  2. ファイル ハンドルを再度取得する際の問題を修正してみてください (1 つの例として、その場合の既定のファイルを使用することが考えられます)。これにより、bufferedReaderが適切に初期化されます。

このようにCheckedException、プログラム自体を作成する場合に役立ちます。これらは、考えられる障害に関する情報を提供し、事前に適切な処理の決定を下すことができるようにします。

一方、 などの未チェックの例外NullPointerExceptionは、コンパイル時に特定するのが難しく、見過ごされる可能性があります。発生して処理されない場合、実行時に問題が発生します。

于 2012-11-11T17:47:36.297 に答える