2017-04-05 15 views
0

に関する例外があります。とthrow/throws句内での考慮方法です。例外がチェックされ、チェックされていない例外タイプ

私は以下の2つの例がありますが、java.lang.Exceptionがどのように処理されたかを正確には理解していません。チェックされているか、チェックされていない例外です。

次のメソッドが正常にコンパイル:

public double method1() throws Exception { 
    return 0.7; 
} 
  • ここではのjava.lang.Exceptionjava.lang.RuntimeExceptionでjava.lang.Errorを脅かしているように私には思えます。あなたがそれを処理しなくてもそれを投げることを宣言することができます。
  • 例外の代わりにチェック済みの例外(サブクラスがの場合java.lang.Exception)を使用した場合、メソッド本体内でスロー宣言を行う必要がありますそれは例外をチェックしました)。右?以下はコンパイルされません

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); 
} 
  • を、ここでは私の混乱です...それはタイプjava.lang.RuntimeExceptionまたはjava.langでのサブクラスを投げていた場合。エラーがコンパイルされていました。
  • なぜこの場合はコンパイルされませんか?私はそれがjava.lang.Exceptionのをチェック例外として脅かすからだと思います。しかしそうなら、なぜmethod1がコンパイルされるのですか?

それは型java.lang.RuntimeExceptionまたは のサブクラスを投げていたでjava.lang.Errorそれがコンパイルされていた希望の場合、 ルイサ

+0

[Java:checkedと未チェックの例外の説明]([http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-provisioning)の可能な複製] – Burkhard

答えて

1

をいただき、ありがとうございますか!

はい、RuntimeExceptionはチェックされない例外(またはError)であるので、あなたは、メソッドのシグネチャまたは明示的catchそれを上にそれを宣言する必要はありません。たとえば、NullPointerExceptionのように、実行時にコード内でそのようなことが起こる可能性がある(つまり、どの問題のためにコード内のどこでも明示的に処理する必要はない)何らかの理由で実行時に発生すると、例外スタックトレースが表示されます。

しかし、一点は、あなたがcatch(あなたがしたい場合)RuntimeExceptioncatchを使用して)ことができますし、違っその例外を発生させる際に、物事に対処したい場合は、それを扱う、あなたがこの上で、以下の見ることができるということです。

try { 
    //some code 
} catch(ArithmeticException exe) { 
    //handle it and you can do things differently how you like 
} 

また、同じ規則、すなわち、同様にさえthrowsに適用します必要に応じて、メソッドシグネチャにthrowsArithmeticException(または任意のRuntimeException)を指定できますが、呼び出し元には何の違いもありません。コードが乱雑になりますが、ベストプラクティスではありません。これはhereです。チェックされたExceptionのメソッドでthrows caluseを指定すると、呼び出し側はそれを処理する必要があります。つまり、呼び出し元メソッドはcatchブロックまたはthrowブロックを使用して明示的に処理する必要があります。

なぜこの場合はコンパイルされませんか?私はそれが確認された例外として java.lang.Exceptionを脅かすためだと思います。しかしそうなら、なぜ method1がコンパイルされますか?

はい、チェック例外に対処するための2つのルールがあります

(1)catchそれcatchブロック

(2)または方法からthrowそれを(使用throwsを用いる方法内側

つまり、コードブロックthrowsにチェックされた例外がある場合は、メソッドの内部でそれをキャッチする必要があります。そうでない場合は、メソッドは明示的にthを宣言する必要がありますそれはExceptionをスローする。

0

方法は、コンパイルのために、このようにする必要がある:

private void method2(int age) throws Exception 
{ 
    if (age > 30) 
     throw new Exception(); 
} 

しかし、チェック例外は、その例外に作用し、そのようななどのリソースを解放するように意味のある何かをすることができるという方法であり、あなたが知っているだろう例外の実際のサブクラスを投げるときにだけ、その例外をどうするか。

0

throws宣言と未チェックが宣言することはできませんし、あなたがJavaでライン

throw Exception(); 

newキーワードを欠場法2では、すべてのチェック例外を宣言する必要があります。

チェックされた例外は、java.lang.Excetionクラスから継承されたものです。ただし、チェックされていない例外はjava.lang.RuntimeExceptionクラスを継承します。

0

Throws句を使用して例外を宣言し、thowキーワードを使用して明示的に例外をスローします。あなたは

private void method2(int age) { 
    if (age > 30) 
     throw Exception(); 
} 

を書くとき だからあなたは明示的に例外をスローするが、方法はthrows句を使用して、この例外を投げることができることを宣言されていません。

だから、正しいコードはここに

private void method2(int age) throws Exception { 
if (age > 30) 
    throw new Exception(); 
    } 
+0

それを投げたり、例外。許可されていますが、正しくありません。 –

1

のjava.lang.Exceptionがjava.lang.RuntimeExceptionまたはでjava.lang.Errorを脅かしているように私には思えるだろう。あなたがそれを処理しなくてもそれを投げることを宣言することができます。

例外の代わりに、チェックされた例外(java.langのサブクラス)を使用した場合、例外)、メソッド本体内で宣言をスローする必要があります(または、そのチェック例外をスローするメソッドを呼び出す)必要があります。右?

いいえ例外をスローする(チェックされているかチェックされていない)とスローしないと宣言できます。

これは、メソッドがサブクラスでオーバーライドされ、サブクラスがチェック例外をスローできるようにする場合などに意味があります。メソッドをオーバーライドすると、親クラスが宣言しているチェック例外だけをスローできます。第一の方法1において

2

)、

public double method1() throws Exception 
{ 
    return 0.7; 
} 

もし例外 [すなわちを伝播していますコンパイル時の例外が表示されていない理由を呼び出したメソッドにチェックします。 あなたは時例外をコンパイル取得します、呼び出し()上記のコードで

public void call() { 
    method1(); // Because method1() is propagating compile time exception you must need to handle it here. 
    } 

    public double method1() throws Exception { 
    return 0.7; 
    } 

、私はあなたがよりよく理解させることができるものをお見せしましょう。あなたがそれを処理する必要がなければなりませんので、あなたがチェック例外をスローしている第二の方法2)

private void method2(int age) { 
    if (age > 30) 
     throw new Exception(); //I am assuming you forgot to mention new in your code. 
} 

。 代わりにException()をRuntimeExceptionに変更すると、コンパイル時にエラーが表示されなくなります。それがチェック1ですので、詳細については、下記、

private void method2(int age) { 
     if (age > 30) 
      throw new RuntimeException(); // you will not get compile time error. 
    } 

、あなたの最初の例で http://technostepup.com/CoreJava/ExceptionHandling/exception-types.php

0

のように、あなたがそのメソッドを呼び出す場合は、それがスロー例外を処理する必要があります。メソッドがチェックされていない例外をスローした場合、それを処理する必要はありません。

Exceptionクラスをスローしようとしているため、2番目の例はコンパイルされません。代わりに、そのインスタンスを投げる必要があります。そのコードでExceptionRuntimeExceptionまたはErrorまたはそのサブクラスに変更するだけであれば、同じ理由でまだコンパイルされません。

関連する問題