8

どれくらい良いですか:

 if (condition) {
  try {
   //something
  } catch(SomeEx ex) {}
 }

これの代わりに:

 try {
   if (condition) {
     //something
   }
 } catch(SomeEx ex) {}

try ブロックに入ると、実際に JVM は何をしますか?

編集:2番目の例では常に試してみることを知りたくありません...質問に答えてください。

4

6 に答える 6

3
try {if (condition) {...}} catch(SomeEx ex) {}

ここでは、内部で発生した場合でも if の条件が発生した場合に例外を処理しましたif-block

if (condition) {try {...} catch(SomeEx ex) {}}

ここでは、内部でのみ発生した場合に例外を処理しますif-block。if 条件で何か問題が発生した場合、それは処理されません。

したがって、実際のシナリオに依存します。

于 2013-07-31T09:18:16.003 に答える
1

パフォーマンスの観点からは、同じはずです。例外のスローはコストのかかる操作です (まず、スタックトレースを作成してデータを入力する必要があります)。try ブロックが存在するだけで、パフォーマンスが低下することはありません (または無視できる程度)。

java try ブロックの範囲をできるだけ厳密に設定する必要があるを参照してください。

try ブロックに入ると、実際に JVM は何をしますか?

JLS 14.20.1から。try-catch の実行:

finally ブロックのない try ステートメントは、最初に try ブロックを実行することによって実行されます。次に、選択肢があります。

  • try ブロックの実行が正常に完了すると、それ以上のアクションは実行されず、try ステートメントは正常に完了します。

  • 値 V がスローされたために try ブロックの実行が突然完了した場合は、次の選択肢があります。

    • V のランタイム型が、try ステートメントの任意の catch 句のキャッチ可能な例外クラス (§5.2) と互換性のある代入である場合、最初 (左端) のそのような catch 句が選択されます。値 V が選択された catch 句のパラメーターに割り当てられ、その catch 句のブロックが実行され、選択があります。

      • そのブロックが正常に完了すると、try ステートメントは正常に完了します。

      • そのブロックが何らかの理由で突然完了した場合、try ステートメントは同じ理由で突然完了します。

    • V の実行時の型が、try ステートメントのいずれかの catch 句のキャッチ可能な例外クラスと互換性のある割り当てではない場合、値 V がスローされるため、try ステートメントは突然完了します。

  • try ブロックの実行が他の理由で突然完了した場合、try ステートメントは同じ理由で突然完了します。

編集:

完全な例外の説明については、The New Idiot's answer の JVM 2.10リンクを参照てください。

于 2013-07-31T09:20:05.677 に答える
0
if (condition) {
  try {
   //something
  } catch(SomeEx ex) {}
 }

JVM は try ブロックをコンパイルし、catch ブロックまたは finally ブロックを検証します。利点はコンパイル時ではなく実行時だと思います。コンパイル時間私はまったく利点がないと思います

于 2013-07-31T09:17:27.763 に答える
0

例外は、コードが実行されるたびにではなく、例外的なケースである必要があります。trying する前に状態を確認することをお勧めします。

if (condition) {
  try {
    //something
  } catch(SomeEx ex) {}
}

if (condition)、それ自体が . をスローしないことを確認してくださいException

使い方や機能によって異なります。たとえば、これはより良いでしょう:

if (someObject!=null) {
  try {
     someObject.getSomething(); // getSomething() potentially throws some Exception
  } catch(SomeEx ex) {}
}

try ブロックに入ると、実際に JVM は何をしますか?

JVM仕様 2.10を読んでください。

于 2013-07-31T09:17:42.737 に答える