1

Java での例外処理の基本について、いくつかの基本的な質問があります。myArrayExceptionを拡張する独自の例外クラス を実装しましたNegativeArraySizeException。コードはかなり基本的なもので、全体を以下に示します。

class myArrayException extends NegativeArraySizeException {

    myArrayException() {
        super("my custom exception class");
    }
}

public class myClass {
    public static void main(String args[]) {
        try {
            myMethod();
        } catch (myArrayException e) {

            System.out.print("hello");
        }
    }

    public static void myMethod() {
        int size = 5;
        if (size < 0) {
            throw new myArrayException();
        }
        int[] a = new int[size];
        System.out.print("code successfully reached");
    }
}

コードは正常に動作します。「サイズ」変数に負の値を設定すると、ブロック内のコード:

catch(myArrayException e) {
    System.out.print("hello");
}

適切に実行されます。しかし、私が追加すると

public static void myMethod() throws myArrayException

if 条件を削除すると、作成した catch ブロックは実行されません。誰でも理由を教えてもらえますか? 特に、そのメソッドに「throws myArrayException」を指定しているので?

4

3 に答える 3

4

throws関数が例外をスローできることを意味します。常に例外がスローされるという意味ではありません。

つまり、throwsステートメントを追加すると、メソッドを呼び出す人は誰でも、この例外の try.. catch ブロックを追加する必要があります。

チェックされた例外とチェックされていない例外を読み取る

于 2013-03-06T15:14:07.913 に答える
0

Javaのキーワードに関する情報に加えてthrows、実際には実行しないプログラムを作成した可能性があります。というか、ハンドルされない例外によって停止されます。あなたは言う

しかし、if条件を追加public static void myMethod() throws myArrayExceptionして削除すると

「if条件」とは、次のチェックを意味します。

    if (size < 0) {
        throw new myArrayException();
    }

その後MyMethod、もうスローしませんmyArrayException。代わりに、ステートメントはキャッチしていない をint[] a = new int[size];スローし、通常はプログラムの実行を停止する未処理の例外になります。その場合、行も実行されず、プログラムが何もしていないように見えます。NegativeArraySizeExceptionSystem.out.print("code successfully reached");

特定の質問に答えるために(完全な開示、私がJavaを使用して以来ずっとです)、throwsキーワードはあなたの方法の免責事項です。メソッドのコンパイルや実行には影響しません。バラキーが見事に述べているように:

throws関数が例外をスローできることを意味します。常に例外がスローされるという意味ではありません。

  1. 「myMethod throws myArrayException」はコードに影響しますか? いいえ、効果はありません。他人への警告にすぎません。
  2. 「if」ブロック全体を削除すると、JRE自体がそれを処理しますか? JRE は最高レベルのプログラムであるため、キャッチされなかった例外を処理します。if ブロックそのthrow中のステートメントを削除するとNegativeArraySizeException、(配列割り当ての行から) 正味のサイズが渡されたときに、 の代わりに がスローされint[] a = new int[size];ますMyArrayExcpetion
  3. throwmyMethod のステートメントは重要であり、そうではありませんmyMethod throws myArrayExceptionか? 重要なのは相対的な用語です。ステートメントは、throwプログラムのフローと実行に影響を与えるため、すぐに実行されるコードにとって重要です。メソッド宣言のthrows myArrayExceptionon は、すぐには影響しません。しかし、このコードが他の人によって、あるいは自分自身によってさえ、アプリケーションの最後の行をすべて書いたときに何を考えていたか覚えていないほど長い期間にわたって広く使用されることを期待している場合、それは非常に重要になります。 ...
  4. なぜなら、このステートメントがなくてもコードは正常に機能するからです.... なぜこのステートメントを追加するのですか? 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 に関するわずかな記憶を組み合わせたものです。チェックされた例外の正確な定義はわかりませんが、少なくともその本質と、チェックされていない例外との違いを把握できれば幸いです。これが間違っている場合は修正してください。

編集:さらに読んでみると、チェック例外とそうでないものについて、私は非常に間違っていると思います。うまくいけば、誰かが私を修正できます。

于 2013-03-06T16:02:22.903 に答える
0

オラクルのサイトには、学習すべきチュートリアルがあります。例外を理解するのに役立ちます。リンクは次のとおりです。

http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html

于 2013-03-06T15:22:33.050 に答える