2016-07-12 18 views
3

こんにちは私はちょうどExceptionを投げて、NullPointer Exceptionのような特定の例外を投げることの違いは何ですか?例外をスローして特定の例外を投げることの違いは、NullPointerExceptionなど

Exceptionは、特定の例外を使用するときにその例外タイプだけがスローされることが予想されるあらゆるタイプの例外をキャッチできる必要があります。

例:

void test(String testString) throws NullPointerException; 

void test(String testString) throws Exception; 

これはそれだけで、常に例外をスローすると、特定の例外に名前を付けることはありませんすることは理にかなって私よりも正しい場合。私はここで何か重要なものを逃しています最低でもパフォーマンスに影響はありますか?多くの人々が例外を投げて捕まえることを見ているが、誰もこの非常に基本的な質問はしない。

私はException以外の任意の例外をスローすることの利点を見ていないので、すべての情報は大歓迎です。

+1

これはどのようにチェーンの例外をすることができ、その種類の使用することです。特定の例外が発生したことを示すために特定の例外をスローしたいだけではなく、「やあ、何かがうまくいかず、アプリケーションが停止しましたが、私は理由がありません! :) – Seth

+0

あなたのコードがいくつかの異なる方法で失敗する可能性があり、そのうちのいくつかは呼び出しコードによって処理され、いくつかは処理できない場合はどうなりますか?あなたが 'Exception'を投げるだけであれば、呼び出しているコードはどうやってそれらを区別するのですか? – azurefrog

+3

[Javaでは、一般的な例外と特定の例外(IOExceptionなど)をキャッチする違いは何ですか?](http://stackoverflow.com/questions/5979501/in-java-what-is-the -difference-catch-a-generic-exception-and-a-specific) – azurefrog

答えて

3

開始するには、ExceptionはすべてExceptionの基本タイプです。ちょうどobjectのようにすべてのものです。

Exceptionを投げることによって、あなたは何が起こったのかについてより多くの情報を消費者に提供します。 メッセージなしの平文Exceptionが得られるシナリオを想像してください。消費者は失われています。たとえば、フレームワークがNullReferenceExceptionをスローすると、オブジェクトの1つにアクセスしようとしていた参照がないことに気が付きます。あなたが特定のケースのために特定の例外をスロー

try 
{ 
    throw new NotImplementedException(); 
} 
catch(NullReferenceException ex) 
{ 
    // Logic for NullReference exception if needed. 
} 
catch(NotImplementedException ex) 
{ 
    // This will be executed. 
} 
catch(Exception ex) 
{ 
    // Will catch every exception. 
} 
+1

素晴らしい例私は特定の例外をスローすることの重要性を理解しています。どうもありがとう。この投稿が例外を投げて他の初心者に役立つと思うなら、投稿を投票してください。また、この投稿を私に知らせてもらえると思うなら、 – L1ghtk3ira

0

はそれではなく、一般的なもので、特定の例外をスローするのがベストプラクティスです。呼び出し側はあなたが例外ArgumentNullExceptionのために不正な要求応答(400)を返すようにしたいかもしれませんが、あなたは、例外の他のタイプの異なる結果を返すようにしたいかもしれませんWEBAPI、例えば、異なった例外を処理する場合がありますので、これがあります。たとえば、実際にカスタムNotFoundExceptionをスローし、コントローラがそれをキャッチしてNot Foundレスポンス(404)を返すことがあります。 特定の例外をスローすると、コンシューマーコードでさまざまな例外シナリオを処理できるようになります。

2

あなたが言及したNullPointerExceptionは、Exceptionの非常に良い例です。RuntimeExceptionのサブクラスです。 RuntimeException(のサブクラス)をスローすることは、捕まえるか宣言する必要はありません。

その他(= RuntimeExceptionのないサブクラス)例外がtry/catchブロックまたは throws宣言のいずれかで、あなたのコードで処理する必要があります。さもなければ、あなたのコードはコンパイルされません!これは、あなたが開発者としてポップアップする可能性のあるエラーを処理するように強制します。別の例外のタイプを使用することが有益である理由は、複数の catchステートメントを使用して、次の簡単な例を検討用として

:この例では

void doDBStuff(){ 
    try { 
    performStatement(someStatement); 
    } catch(SQLException e){ 
    //invalid SQL syntax, something is broken 
    } catch(AuthenticationException e){ 
    //invalid user credentials for the db, inform the user to change these values 
    } 

を、二つの異なる例外を使用すると、処理することができます二つの異なるcatchブロックで終わりますこれらのエラーは異なっている。

+0

_ "それ以外の場合、コードはコンパイルされません!" – MickyD

+0

はい。 '' IOException'をスローして '' throws''を使ってそれをキャッチしたり宣言したりしないと、 "未処理の例外の型IOException"というテキストでコンパイルエラーが発生します。 – f1sh

+0

いいですね。ありがとう。 +1 – MickyD

4

あなたは例外の特定の種類をスローする理由、少なくとも2つの理由があります。

  1. プログラムが例外で失敗した場合、あなたは何が悪かったのかを決定するとのより多くの情報を持っていますが。 ExceptionFileNotFoundExceptionを比較してください。後者は明らかにより多くの情報を提供します。いくつかのケースでは
  2. 、コードは例外の特定の種類をキャッチしたいと思うでしょう。たとえば、シリアルポートで作業する場合は、TimeoutExceptionをキャッチしてNullReferenceExceptionとは異なる方法で処理することができます。
+0

ありがとう、彼は彼が追加した優れた例のために@ Carl'sを選んだ。素晴らしい情報ですが、私はあなたのことをまだマークしています。あなたがこの投稿が例外を投げて他の初心者に役立つと思うなら、投稿をマークアップしてください。 – L1ghtk3ira

+0

また、私がこの投稿をより良くすることができると思うなら、私に知らせてください。 – L1ghtk3ira

関連する問題