私はC++のバックグラウンドを持っており、Javaで常にこれを行っています。
SomeClass sc=new SomeClass();
if(null!=sc)
{
sc.doSomething();
}
私が知りたいのは、コンストラクターが何らかの理由(メモリが不足しているなど)で失敗した場合に変数scに何が含まれるかです。正解が見つかりません。新しい演算子が失敗した場合、プログラムがクラッシュする可能性があるため、時間を無駄にしているのではないかと心配しています。
私はC++のバックグラウンドを持っており、Javaで常にこれを行っています。
SomeClass sc=new SomeClass();
if(null!=sc)
{
sc.doSomething();
}
私が知りたいのは、コンストラクターが何らかの理由(メモリが不足しているなど)で失敗した場合に変数scに何が含まれるかです。正解が見つかりません。新しい演算子が失敗した場合、プログラムがクラッシュする可能性があるため、時間を無駄にしているのではないかと心配しています。
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
ドキュメントから:
An
Error
は、そのサブクラスでありThrowable
、合理的なアプリケーションがすべきではない深刻な問題を示しtry
ますcatch
。そのようなエラーのほとんどは異常な状態です。これらのエラーは決して発生してはならない異常な状態であるため、メソッドは、その
throws
句で、メソッドの実行中にスローされる可能性があるがキャッチされない可能性のあるサブクラスを宣言する必要はありません。Error
コンストラクターが失敗した場合、例外またはエラーがスローされ、プログラムでそれ以上取得できなくなります。具体的には、メモリが不足した場合は、を取得しOutOfMemoryError
ます。
SomeClass sc=new SomeClass();
if(null!=sc) { sc.doSomething(); }
オブジェクト参照はオブジェクトのnull
作成後に行われることはないため、条件は常にtrueになるため、nullチェックは不要です。
たとえば、コンストラクターのポイントに十分なメモリがない場合、anOutOfMemoryError
がスローされ、コンストラクターは正常に戻りません。
はい、あなたはあなたの時間を無駄にしています:-)。コンストラクターが呼び出された後、scはnull以外であることが保証されます。コンストラクターが失敗した場合、例外がスローされ、次のコードは実行されません。したがって、Javaでは次のことが安全です。
SomeClass sc = new SomeClass();
sc.doSomething();
NullPointerExceptionをスローせずに。
このif
チェックは不要であり、一部のIDEは、常にと評価されるため、不要であると文句を言うことさえありtrue
ます。失敗する唯一の理由new
は、コンストラクターが例外をスローした場合です。その場合、if
チェックはとにかくバイパスされます。
OutOfMemoryErrorがスローされ、通常は仮想マシンがクラッシュします。(スロー可能としてキャッチされる可能性があります)
JavaOutOfMemoryエラーからの防止と回復が役立つ場合があります。