3

次のコードを検討してください。

final MyClass myObject;
try {
    myObject = new MyClass(...)
} catch (MyClassException){
    // terminate
    System.exit(1);
}

myObject.doSomething();

問題は、Netbeans エディター/パーサーが.doSomething()、ユニット化されたオブジェクトで呼び出される可能性があると考えていることですが、もちろんそうではありません。

これを回避するための通常/標準のパターンはありますか? 私は関数を呼び出すことができましたが、むしろそれをしたくありません。他に何もスローしないため、ブロック全体を try catch ブロックで囲みません。MyClassException

私は (まだ ;-)) Java の文法とパターンの専門家ではないので、明らかな何かが欠けていることを願っています。

4

6 に答える 6

1

問題は、Netbeans エディター/パーサーが、.doSomething() がユニット化されたオブジェクトで呼び出される可能性があると考えていることですが、もちろんそうではありません。

これ事実です。JVM の終了SecurityManagerを禁止する を使用することを妨げるものは何もありません。System.exit()その場合、次のステートメントを実行できます。

Java 文法の観点から、コンパイラは、を呼び出したときにmyObject確実に割り当てられmyObject.doSomething();ていることを証明する必要があります。

JLSは、これを行うことができる状況を指定します。特に、次の命令が実行されないことを決定するために使用できる唯一のステートメントは、、、、breakおよびです。したがって、コンパイラは、次のステートメントの実行を妨げると見なすことはできません。continuereturnthrowSystem.exit(1);

于 2013-05-29T09:03:03.627 に答える
1

Netbeans エディター/パーサーは、.doSomething() が、もちろんそうではない、初期化されたオブジェクトで呼び出される可能性があると考えています。

あなたはここで間違っています。実際、変数を初期化しようとしています。コンパイラは初期化を「信頼」しません。その理由は簡単です。例外をスローする可能性があります。これはキャッチできますが、 newをスローRuntimeException()したり、System.exit(1). 例えば:

try {
    myObject = new MyClass(...)
} catch (MyClassException e){
    // hey I catch this but do nothing lmao yolo
    e.printStackTrace();
}

myObject.doSomething();

例外をキャッチし、スタックトレースを出力してプログラムを続行すると、結果はNullPointerException.

于 2013-05-29T08:45:45.080 に答える
1

これは私ができる最善のことです:

final MyClass myObject;
{
    MyClass local = null;
    try {
        local = new MyClass(...)
    } catch (MyClassException){
        // terminate
        System.exit(1);
    }
    myObject = local;
}

myObject.doSomething();
于 2013-05-29T08:46:04.900 に答える
1

たとえば、try/catch ブロックの外側で、インスタンス化されていない可能性のあるオブジェクトに対してメソッドを呼び出そうとした場合です。これは、try/catch ブロックが例外をスローする可能性があるため、オブジェクトが作成されないためです。したがって、この場合、doSomething()メソッドを呼び出そうとしてもオブジェクトがありません。

メソッド呼び出しを try/catch ブロックに含めると、機能します。

関連情報はここにあります: Java チュートリアル: レッスン: 例外

于 2013-05-29T08:40:19.687 に答える
1

final変数とメンバーのポイントは、常に初期化することです。コードは を呼び出すことはありませんがdoSomething、最終フィールドは未定義のままになります。finallyこれは、句を try-catch ブロックに追加する場合に問題になります。finally例外が発生したときに句を入力するmyObjectことができ、コンパイラはこれを回避する必要があります。

final MyClass myObject;
try {
    myObject = new MyClass(...); // constructor may throw exception
} catch (MyClassException){
    // terminate
    System.exit(1);
} finally {
    // what does myObject point to now, if the constructor threw exception?
}

myObject.doSomething();

doSomething簡単な解決策は、呼び出しを try ブロックに移動することです。

final MyClass myObject;
try {
    myObject = new MyClass(...);
    myObject.doSomething();
} catch (MyClassException){
    // terminate
    System.exit(1);
}

doSomethingもスローしない限り、これは正常に機能するはずMyClassExceptionです。そのような例外がスローされた場合は、おそらくそれがコンストラクターまたはメソッドのどちらから来たのかを区別する必要があります (もちろん、これがロジックにとって重要な場合)。

于 2013-05-29T08:48:04.610 に答える