アルンゴウダ:
Javaでは、私がこれまで見てきたことは、私たちが例外をスローするたびに、私たちは新しい例外を投げるということです。次の例のように。
try{
somethingThatCanGoWrong();
}catch(Exception e){
throw new FailedToDoSomethingException("The other guy failed");
}
例外の新しいインスタンスをスローすることは常に必要ですか?私はそれを次のように行うことができますか?
public class Blah
{
private static final FailedToDoSomethingException failedToDoSomethingException = new FailedToDoSomethingException(
"The other guy failed" );
public static void main( String[] args )
{
try {
somethingThatCanGoWrong();
} catch ( Exception e ) {
throw failedToDoSomethingException;
}
}
}
ため、私は2つの理由の最後の例を好みません。
- オブジェクトがorientallyに言えば、任意の例外は、クラスのプロパティ、またインスタンスのプロパティでもありません。
例外メッセージが動的に生成され、メソッドの引数に基づいてされたときの環境をマルチスレッドで無残に失敗します。以下は一例です。
File getFile(String filePath){
throw new FileNotFoundException("File at path: "+filePath+" was not found");
}
上記2から離れて、それ以上の理由がありますか?私たちは、例外の新しいインスタンスを作成するときに舞台裏で何がありますか?例外コンテキストを取り込むようなもの(スタックトレースのように。しかし、私は、我々が使用したときにそれが起こると信じてthrow
キーワードを)?
それとも、それはちょうど良い練習のすべての時間を新しい例外をスローするのですか?(繰り返しますが、それは良い練習ですWHY?)
ピーター・ラスティグ:
スタックトレースが示す例外を作成したときに、それがスローされた場所なので、あなたが本当に見ることができないライン。
あなたは、この例を実行することができます。
public class Foo {
private static final RuntimeException re = new RuntimeException("MSG");
public static void main(String[] args) {
try {
Integer.parseInt("!!#!");
} catch (Exception e) {
throw re;
}
}
}
あなたは、スタックトレースを見てみましょうする場合:
Exception in thread "main" java.lang.RuntimeException: MSG
at test.Foo.<clinit>(Foo.java:5)
あなたは、スタックトレースの行は、あなたが実際に例外をスローではなく、ラインはあなたが呼んでいた行がないことを確認します new