9

私はC++のバックグラウンドを持っており、Javaで常にこれを行っています。

SomeClass sc=new SomeClass();

if(null!=sc)
{
    sc.doSomething();
}

私が知りたいのは、コンストラクターが何らかの理由(メモリが不足しているなど)で失敗した場合に変数scに何が含まれるかです。正解が見つかりません。新しい演算子が失敗した場合、プログラムがクラッシュする可能性があるため、時間を無駄にしているのではないかと心配しています。

4

6 に答える 6

12

Java仕様言語第3版は、あなたの質問を完全にカバーしています。

12.5新しいクラスインスタンスの作成

新しいクラスインスタンスが作成されるたびに、クラスタイプで宣言されたすべてのインスタンス変数と、クラスタイプの各スーパークラスで宣言されたすべてのインスタンス変数(非表示になっている可能性のあるすべてのインスタンス変数を含む)のためのスペースを備えたメモリスペースが割り当てられます。オブジェクトにメモリを割り当てるのに十分なスペースがない場合、クラスインスタンスの作成は。で突然完了しますOutOfMemoryError。それ以外の場合、スーパークラスで宣言されたものを含む、新しいオブジェクトのすべてのインスタンス変数は、デフォルト値に初期化されます。

結果として新しく作成されたオブジェクトへの参照が返される直前に、指定されたコンストラクターが処理され、次の手順を使用して新しいオブジェクトが初期化されます。[...]

newしたがって、式がを返すことは単純に不可能nullです。instanceof返されるものは何でも、実行が正常に完了すると、インスタンス化されたクラスが何であれ、常に有効になります。


例外の処理

一般的に、発生する可能性のある例外は通常、try-catchブロックで処理されます。

String someString = askFromUser();
try {
   int num = Integer.parseInt(someString);
   doSomethingWith(num);
} catch (NumberFormatException e) {
   complainAboutIt();
}

あなたの場合、対応するブロックを入れることを検討するかもしれませんがnew SomeClass()tryこれcatch (OutOfMemoryError e)は非常に非定型です。これが発生したときに何か意味のあることをする予定がない限り、ほとんどの一般的なシナリオでは、プログラムの実行中に発生する可能性のあることはcatch何もしないことが最善です。Error

ドキュメントから:

AnErrorは、そのサブクラスでありThrowable、合理的なアプリケーションがすべきではない深刻な問題を示しtryますcatch。そのようなエラーのほとんどは異常な状態です。

これらのエラーは決して発生してはならない異常な状態であるため、メソッドは、そのthrows句で、メソッドの実行中にスローされる可能性があるがキャッチされない可能性のあるサブクラスを宣言する必要はありません。Error

関連する質問

も参照してください

于 2010-08-06T07:51:30.770 に答える
7

コンストラクターが失敗した場合、例外またはエラーがスローされ、プログラムでそれ以上取得できなくなります。具体的には、メモリが不足した場合は、を取得しOutOfMemoryErrorます。

于 2010-08-06T06:56:51.983 に答える
2
SomeClass sc=new SomeClass();

if(null!=sc) { sc.doSomething(); }

オブジェクト参照はオブジェクトのnull作成後に行われることはないため、条件は常にtrueになるため、nullチェックは不要です。

たとえば、コンストラクターのポイントに十分なメモリがない場合、anOutOfMemoryErrorがスローされ、コンストラクターは正常に戻りません。

于 2010-08-06T07:00:37.983 に答える
1

はい、あなたはあなたの時間を無駄にしています:-)。コンストラクターが呼び出された後、scはnull以外であることが保証されます。コンストラクターが失敗した場合、例外がスローされ、次のコードは実行されません。したがって、Javaでは次のことが安全です。

SomeClass sc = new SomeClass();
sc.doSomething();

NullPointerExceptionをスローせずに。

于 2010-08-06T06:58:55.697 に答える
1

このifチェックは不要であり、一部のIDEは、常にと評価されるため、不要であると文句を言うことさえありtrueます。失敗する唯一の理由newは、コンストラクターが例外をスローした場合です。その場合、ifチェックはとにかくバイパスされます。

于 2010-08-06T06:59:24.070 に答える
0

OutOfMemoryErrorがスローされ、通常は仮想マシンがクラッシュします。(スロー可能としてキャッチされる可能性があります)

JavaOutOfMemoryエラーからの防止と回復が役立つ場合があります。

于 2010-08-06T07:00:09.223 に答える