-1

try-catchこれらのブロックの使用法と、それぞれをいつ使用すべきかの違いは何ですか?

try {
  doSomething1();
} catch(Exception e1){
  exception_handle1();
}
try {
  doSomething2();
} catch(Exception e2){
  exception_handle2();
}

try {
  doSomething1();
  doSomething2();
} catch(Exception e1) {
  exception_handle1();
} catch(Exception e2) {
  exception_handle2();
}

try {
  doSomething1();
  try {
    doSomething2();
  } catch(Exception e2){
    exception_handle2();
  }
} catch(Exception e1){
  exception_handle1();
}
4

5 に答える 5

3
try {
  doSomthing1()
catch(Exception e1){
  exception_handle1()
}
try {
  doSomthing2()
catch(Exception e2){
  exception_handle2()
}

doSomthing1()doSomthing2()は無関係なメソッドです。それらのいずれかの障害は、互いに独立しています。

try {
  doSomthing1()
  doSomthing2()
catch(Exception e1){
  exception_handle1()
}catch(Exception e2){
  exception_handle2()
}

この方法で try-catch ブロックを使用して、失敗したdoSomthing2()場合にメソッドの実行を停止doSomthing1()できます。2 つの catch ブロックを使用して、各例外を個別に処理できます。ただし、注意すべき重要な点の 1 つは、あなた2nd catch blockunreachable code. 一般に、より具体的な例外の catch ブロックを最初に作成し、次に一般化された例外を作成する必要があります。さて、あなたの場合、2番目のcatchブロックが処理するはずのすべての例外は、最初のブロックですでに処理されています。

try {
  doSomthing1()
  try {
    doSomthing2()
  catch(Exception e2){
    exception_handle2()
  }
}
catch(Exception e1){
  exception_handle1()
}

2 つの try-catch ブロックが互いに埋め込まれています。失敗した後でもdoSomthing2()、プログラムは try ブロック内で続行します。

于 2012-12-03T08:34:52.720 に答える
2

さて、最初の2つと他の2つの明らかな違いは、例外をスローしたdoSomthing2かどうかに関係なく試行されることdoSomthing1です。引用した正確なコードでは、3番目の例以外の2番目と3番目の例(構文エラーは別として)に大きな違いはありません。2番目の例外処理コードtryは最初の例外処理コードにあります。したがって、スローすると、スローがキャッチされます。

どちらを使用するかは、状況によって異なります。例外をスローするdoSomthing2かどうかに関係なく実行することが適切な場合があります。doSomthing1そうでない場合もあります。

于 2012-12-03T08:32:00.640 に答える
2

doSomThing1が失敗した場合、コードはdoSomthing2の実行に進みます

2番目の例では、doSomthing1が失敗した場合、doSomthing2は実行されません。

一方、3番目の例は2番目の例と似ています。

于 2012-12-03T08:34:17.863 に答える
0

conditionaLステートメントを作成するときと同じ概念ですが、そのconditionaLステートメントは、trycatchがエラーをテストしている条件をテストしています。

于 2012-12-03T09:02:59.080 に答える
0

まず、doSomething1()とexceltion_handle1()を想定し、System.exit(x)などを呼び出さないようにします。

1)したがって、最初のコードはdoSomething1()であり、doSomething1()が例外をスローするかどうかに関係なく、それを処理し(catchコードブロックを処理)、2番目の試行に進んで同じ方法で実行します。

try {
  doSomething1();
} catch(Exception e1){
  exception_handle1();
}
try {
  doSomething2();
} catch(Exception e2){
  exception_handle2();
}

朝なので、間違った決断をしないことを願っています。

2)このコードはdoSomething1()、次にdoSomething2()を実行し、どちらが失敗しても(Exceptionをスロー)、最初のcatch句のみが呼び出されます。これは、すべてのサブクラスとそれ自体を吸収するため、2番目のcatchは呼び出されません。到達しました(最初にすべての可能な例外を取ります)。したがって、afaik、エラーが発生するはずです(コンパイルしないでください)。それは賢く、2番目のキャッチには決して到達しないことを認識します。

正しいパターンは次のようになります。一番下に行くと、例外はますます広くなるはずです(厳密に)。論理的です。キャッチ句の順序が下がるにつれて、上位のキャッチを下位のキャッチの親にすることはできません。いずれにせよ、親はその例外を受け取り、下位の子には到達しません。

Example: (I recommend you to learn about Multicatch in java.)
catch (Specific2ChildOfSpecific1 e3)
...
catch (specific1ChildOfException e2)
...
catch (Exception e1)


try {
  doSomething1();
  doSomething2();
} catch(Exception e1) {
  exception_handle1();
} catch(Exception e2) {
  exception_handle2();
}

3)これ:doSomething1()が失敗した場合はe1 catch句が実行され、合格した場合はdoSomething2()が実行され、失敗した場合はe2catch句が実行されます。

@ 2番目の例に注意してください。どのdoSomethingが失敗しても、e1が実行されます(2番目は到達できないため、エラーがあることを忘れないでください)。しかし、私はあなたが何を聞きたかったのか理解しています。

try {
  doSomething1();
  try {
    doSomething2();
  } catch(Exception e2){
    exception_handle2();
  }
} catch(Exception e1){
  exception_handle1();
}
于 2012-12-03T09:03:51.490 に答える