2017-11-24 13 views
0

最近、私はインタビューを受けており、インタビュー担当者は例外処理に関して私に尋ねました。私は典型的なチェックされていない答えを出しました。それから彼はランタイム例外を処理するべきか尋ねましたか?私はいいえ、その後、私たちがNullPointerExceptionを取得した場合、同じものをユーザに送信するかどうか尋ねられました。実生活プロジェクトのランタイム例外を処理する方法

私は混乱しました。だから私が探しているのは、実行時の例外を捕まえるべきかどうかです。

  1. はい、どうすればいいですか?
  2. いいえの場合は、java.lang.nullpointerExceptionをユーザーに表示しますか?

ありがとうございます。

+1

アプリケーションがクラッシュしないようにする必要があります。私はあなたが例外処理の基本を読むことをお勧めします – Stultuske

+0

[ここ](https://stackoverflow.com/questions/25696642/handling-unchecked-exceptions-globally-in-project/25696687#25696687)をチェックしてください – procrastinator

答えて

1

予測可能なものを処理する最良の方法は、それをキャッチして、起こりうる原因とシステムでユーザーが次に行うことを期待するユーザーフレンドリーな情報を生成することです。

ユーザーにUIベースの電卓を提供するプロジェクトがあるとします。さて、ユーザーが 'division with zero'命令を入力すると、理想的にはどうなるでしょうか? 0の分母をチェックしていないとすれば(もちろん当てはまりません)、あなたのプログラムはArithmeticExceptionをスローします。どのようにそれを処理する必要がありますか?あなたはそれがAPIで、他のアプリケーションによって消費される場合、私はどうなることにある

You cannot divide by zero. Please enter a non zero denominator! 

それをキャッチし、ユーザーは、彼は、システムが期待していなかった入力に入ったことを知らせ、すなわち

必要があります実行時の例外をカスタマイズされたAPI固有の例外にラップし、そこからスローすることで、実装者が情報を使用して適切な方法で処理できるようにします。例えば

public int divide() throws InvalidArgumentsException 
+1

私はそれ以外の場合は非常にdownvoted便利な答え:ArithmeticExceptionをキャッチしてZeroDenominatorExceptionにラップするのは、ゼロによる除算がこのArithmeticExceptionの唯一の原因であることを本当に確信している場合にのみ正当です。一般的に、その例外には多くの異なる原因がある可能性があるため、ZeroDenominatorExceptionは間違っている可能性があります。 'if(denominator == 0)が新しいZeroDenominatorException(...);をスローするようなことをしてください。 –

+0

@RalfKleberhoffうん!私はそれが真実であると信じています。 'ZeroDenominatorException'は' ArithmeticException'のサブセットです。私はこれを 'InvalidArgumentsException'に変更します。これは意味があります。 :) – Yash

+1

編集していただきありがとうございます。私はupvoteとdownvoteを交換しました。 –

0

平均的なユーザーは、NullPointerExceptionが何であるか、どのように起こったのかを知ることはできません。通常、ユーザーにはよりフレンドリーなエラーが表示されます。おそらく、エラーの識別に役立つエラーコードが表示されます。

アプリケーションは、スタックトレースと共にNullPointerErrorをファイルに保存して、開発者がエラーが発生した場所を正確に把握することもできます。

+0

正確には、NPEが発生したことをユーザーに示す必要はありません。しかし、どのようにユーザーにフレンドリーなエラーを表示するには? NPEは単なる例です。 N個のランタイム例外が存在する可能性があります。だから私はどのようにコード内で同じものを実装することができますか? –

0

あなたはUncaughtExceptionHandlerを実装することにより、あなたのアプリケーションでRuntimeExceptionクラスをキャッチすることができます:

Thread.setDefaultUncaughtExceptionHandler(Thread t, Throwable e) -> { 

    // log Exception to file, send to server ecc, you can check which exception was thrown and act accordingly... 

    // you can still re-throw the exception here as if this block did not exist 

}); 

この方法はさらに、これらの他のThreadのインスタンスによってスローされたことを、すべてのキャッチされないExceptionsをキャッチする必要があり、それは単に1つのインプリメンテーションを使用しても安全です。


あなたの質問:

我々はそれが依存ランタイム例外か

をキャッチする必要があります。ファイルシステムでファイルが見つからないという理由だけで、バンキングアプリケーションサーバがクラッシュすることはありません。

同時に、RuntimeExceptionはコードに欠陥があるために発生します。 NullPointerExceptionは避けることができますが、他の多くのもの...

関連する問題