2009-05-08 23 views
8

例外はどこに格納されていますか? スタック、ヒープ。 例外のメモリ割り当てと割り当て解除はどのように行われますか? 処理する必要がある複数の例外がある場合、これらの例外のオブジェクトがすべて作成されていますか?Java例外とC++例外

+0

また、C++での例外と同様に処理されるJavaの例外や追加の対策が必要ですか? – Thunderboltz

+1

ユーザーはJavaやC++を指しているとは言わずにあなたに答えてくれるようです。一方、あなたはどちらについてお尋ねしますか? –

+1

彼は最初にJavaだけについて尋ねました.C++は後で来ました... – Thilo

答えて

7

例外のメモリは、(ヒープ上の)他のすべてのオブジェクトと同じ方法で割り当てられると仮定します。

これは問題でした。なぜなら、OutOfMemoryErrorにメモリを割り当てることができないからです。 は、no stack trace until Java 1.6だったのです。今では、スタックトレース用のスペースもあらかじめ割り当てています。

例外の参照がスローされている間に格納されているのではないかと疑問に思っている場合、JVMは参照を内部的に保持している間にコールスタックを解放して例外ハンドラを見つけ、スタックフレーム、他のローカル変数と同様)。

同時に(同じスレッド上で)2つの例外をスローすることはできません。ネストすることはできますが、ネストされた例外を参照する「アクティブ」例外は1つしかありません。

例外への参照がすべて消えると(例外ハンドラが終了した後など)、例外は他のすべてと同様にガベージコレクションされます。

+0

スタックセグメントまたはデータセグメントに配置する場合は、どこにありますか? – Thunderboltz

+0

C++とは何ですか? – tuergeist

+0

私はC++について何も知らない。彼は最初にJavaだけについて尋ねました、C++は後で来ました.. – Thilo

1

Javaの例外はオブジェクトなので、ヒープに格納されます。

例外がスローされると、JVMはコード内で一致する例外ハンドラを探します。これは何かが投げる可能性がある複数の例外がある場合でも適用されます。

1

例外はどこに保存されていますか? Stack、 ヒープ。メモリはどのように割り当てられ、 は例外として割り当て解除されますか?

例外はこの点で他のオブジェクトと同様です。 new経由でヒープに割り当てられ、ガベージコレクタによって割り当てが解除されました。あなたが を処理する必要が複数の の例外を持っている場合

は、今作成したすべてのこれらの の例外のオブジェクトがありますか?

あなたはこれが何を意味するのかよく分かりません。それらはnewで一度に1つ作成されます。例外連鎖を使用すると、複数の例外が発生することがあります。実際に何千もの例外を作成してリストのどこかに置くことはできません。それほど意味がありません。

2

例外の詳細については、Chapter 11: ExceptionsThe Java Language Specification, Second Editionに直接アクセスしてください。

例外は実際にオブジェクトです。彼らはThrowableのサブクラスである:

すべての例外は Throwableクラスまたはそのサブクラスのインスタンス で表される

。そのようなオブジェクトは、 を使用して、例外が発生した ポイントから情報をキャッチするハンドラを に運ぶことができます。

したがって、Javaの他のObjectと同様に、ヒープ上に割り当てられることはおそらく安全でしょう。

複数のオブジェクトを持つという点では、おそらく例外ではありません.Java仮想マシンは例外ハンドラの検出を開始します。 例外をスローする過程

、Java仮想マシン は突然どんな 式、文、法及び始めている コンストラクタ呼び出し、初期化子、 及びフィールド初期化式 、一つ一つを完了します現在のスレッドで の実行が完了していません。この ハンドラが、 ハンドラが見つかるまで続きます。このハンドラは、 例外のクラスまたは 例外のクラスまたは スーパークラスの例外の名前を指定して処理したことを示します。

実行時に例外を処理する方法の詳細については、Section 11.3 Handling of an Exceptionに詳細があります。

4

C++の場合、例外を格納する場所は定義されていませんが、ほとんどのコンパイラは特別なスタックを使用します。 誰かが書いたJavaの場合、ヒープに格納されています。

例外はC++およびJavaのオブジェクトであるため、特定の言語でオブジェクトとして割り当てられ、割り当てが解除されます。

スレッドごとに常に両方の言語で有効な例外は1つだけです。

+0

だったので、「新しい例外」を実行すると「特別なスタック」に格納されます。今、新しい演算子はどのスタックをいつ使うべきかを区別していますか?特別なケースを扱っていますか? – Thunderboltz

+0

問題は、コンパイラがどのようにオブジェクトを例外として評価し、適切なマシンコードを提供するかです。私が言いたいのは、新しい演算子は区別する必要がないということです。 – tuergeist

+0

ちなみに、「C++では例外を格納する場所が定義されていません」というメモを忘れないでください! – tuergeist

1

Javaでは、ExceptionはObjectを拡張するThrowableを拡張します。つまり、メモリの観点からは、他のどのようなオブジェクトでもあります。

Java変数では、スタック変数の候補を見つけるためにエスケープ解析を使用してスタックにローカル変数を配置することが推奨されています。ただし、例外は通常、メソッドから呼び出し元(または呼び出し元など)にスローされるため、例外をスタックに配置することはあまり役に立ちません。