Javaのキーワードに関する情報に加えてthrows
、実際には実行しないプログラムを作成した可能性があります。というか、ハンドルされない例外によって停止されます。あなたは言う
しかし、if条件を追加public static void myMethod() throws myArrayException
して削除すると
「if条件」とは、次のチェックを意味します。
if (size < 0) {
throw new myArrayException();
}
その後MyMethod
、もうスローしませんmyArrayException
。代わりに、ステートメントはキャッチしていない をint[] a = new int[size];
スローし、通常はプログラムの実行を停止する未処理の例外になります。その場合、行も実行されず、プログラムが何もしていないように見えます。NegativeArraySizeException
System.out.print("code successfully reached");
特定の質問に答えるために(完全な開示、私がJavaを使用して以来ずっとです)、throws
キーワードはあなたの方法の免責事項です。メソッドのコンパイルや実行には影響しません。バラキーが見事に述べているように:
throws
関数が例外をスローできることを意味します。常に例外がスローされるという意味ではありません。
- 「myMethod throws myArrayException」はコードに影響しますか? いいえ、効果はありません。他人への警告にすぎません。
- 「if」ブロック全体を削除すると、JRE自体がそれを処理しますか? JRE は最高レベルのプログラムであるため、キャッチされなかった例外を処理します。if ブロックとその
throw
中のステートメントを削除するとNegativeArraySizeException
、(配列割り当ての行から) 正味のサイズが渡されたときに、 の代わりに がスローされint[] a = new int[size];
ますMyArrayExcpetion
。
throw
myMethod のステートメントは重要であり、そうではありませんmyMethod throws myArrayException
か? 重要なのは相対的な用語です。ステートメントは、throw
プログラムのフローと実行に影響を与えるため、すぐに実行されるコードにとって重要です。メソッド宣言のthrows myArrayException
on は、すぐには影響しません。しかし、このコードが他の人によって、あるいは自分自身によってさえ、アプリケーションの最後の行をすべて書いたときに何を考えていたか覚えていないほど長い期間にわたって広く使用されることを期待している場合、それは非常に重要になります。 ...
- なぜなら、このステートメントがなくてもコードは正常に機能するからです.... なぜこのステートメントを追加するのですか?
throws
基本的に、あなたのコードを見た他の人に、「ねえ、このコードを呼び出す場合は、これらの例外を処理したほうがいいです。そうしないと、プログラムがクラッシュする可能性があります。」この宣言を含める必要はありませんが、含めると、すべての人の生活が楽になります。
メソッドが例外をキャッチした場合、その例外をスローしたと言ってはなりません。私が Java を使用して以来、一般的になったと思われる「チェック済み vs. チェックなし」という用語を使用して、コードを分解します。
public static void MyMethod() throws MyArrayException{
int size = 5;
if (size < 0) {
// Unchecked exception, properly warned callers of MyMethod that you will
// throw it and they need to catch it
throw new MyArrayException();
}
if (size == 3) {
// Unchecked exception, but you didn't warn callers of MyMethod
// No functional impact for your code, but if someone else is relying
// on this method, they won't know catch this and will likely be
// irate with you if it crashed their program
throw new IHateThreesException();
}
try {
int[] a = new int[size];
}
catch(NegativeArraySizeException)
{
// This is a checked exception, because you checked for it with a
// try-catch block and don't re-throw it
System.out.print("Code checked for this but size " + size + " was negative anyways!");
}
catch(OutOfMemoryExcpetion ome)
{
// I _think_ this is still an unchecked exception, because the I choose
// to re-throw it. Regardless, we explicitly throw this exception so
// there is no excuse for us to not have included it in the throws
// declaration
System.out.print("I just canno' do it captain, I don't have the memory!"
+ "(Free up some memory and try again)");
throw ome;
}
System.out.print("code successfully reached");
}
これらの例は、他の人が言ったことと、私自身の Java に関するわずかな記憶を組み合わせたものです。チェックされた例外の正確な定義はわかりませんが、少なくともその本質と、チェックされていない例外との違いを把握できれば幸いです。これが間違っている場合は修正してください。
編集:さらに読んでみると、チェック例外とそうでないものについて、私は非常に間違っていると思います。うまくいけば、誰かが私を修正できます。