-1

私はこれについては間違いを捕まえるつもりだと確信しています...しかし、私はtry/catchブロックのない言語から来ており、Java例外キャッチについて学んでおり、それがどのようになっていないかを理解するのに苦労しています検証の怠惰なバージョンです。私は次のようないくつかの例を見てきました:

String Box [] = {"Book", "Pen", "Pencil"};
while(i<4)
{
    try
    {
        System.out.println(Box[i]);     
    }
    catch(ArrayIndexOutOfBoundsException e)
    {
        System.out.println("Subscript Problem " + e);
        i++;
    }

と:

int y = 0;
int x = 1;
// try block to "SEE" if an exception occurs
try
{
    int z = x/y;
    System.out.println("after division");
} 
catch (ArithmeticException ae) 
{
    System.out.println(" attempt to divide by 0");
}

これらは明らかに非常に初歩的な例です...しかし、IMOはエラーをキャッチするためのひどい例であるか、それを行う正当な理由がありません。たとえば、要素の数をループする場合Box、範囲外のインデックスをチェックする必要はありません。例2では、​​除数が0であることを確認する場合、それを確認する必要はありませんArithmeticException

/ブロックを使用する方が昔ながらの変数検証よりも優れている良い例や理由はありますか?それとも単に「Java」の方法ですか?trycatch

4

7 に答える 7

6

これは、例外のない言語の例です。

if (!rename(file1, tmpName))
  if (!rename(file2, file1))
     if (!rename(tmpName, file2))
        return 0;
return -1;

また、正確に何が悪かったのかについての詳細はないことに注意してください。

Javaとの比較:

try {
   rename(file1, tmpName);
   rename(file2, file1);
   rename(tmpFile, file2);
   return true;
}
catch (IOException e) {
   e.printStackTrace();
   return false;
}

ソース名とターゲット名を例外メッセージに適切に保存すればrename、どこで問題が発生したかを正確に知ることができます。

要約すると、例外メカニズムの利点は次のとおりです。

  • 全体として成功する必要のあるコードのブロックを宣言でき、エラーはすべて同等に扱われます。
  • すべてのエラー処理をアプリケーションの単一のポイント、いわゆる例外バリアに委任できます。
  • 例外オブジェクトは、重要なデバッグ情報を格納します。

例外は大きな勝利であり、すべての現代言語には例外があります。

于 2013-01-04T14:49:45.223 に答える
2

チェックされていない例外であるため、最悪の例を選択しました。これらのタイプのtry/catchブロックがたくさんある場合は、怠惰/不適切な要素について同意する傾向があります。ただし、CHECKED例外の場合、try/catchは非常に便利です。あなたはCをやって退屈しませんでした

int status = thisStatementMayFail();
if (status > 0) {
    // do_stuff
}
else {
    // handleException();
}

私はJavaが好きです

try {
    thisStatementMayFail();
    // do stuff
} catch (Exception e) {
    // handleException
}

怠惰かもしれませんが、間違いなくより良いIMOです。

于 2013-01-04T14:39:10.103 に答える
1

例外は一種のエラーチェックだと思いますが、決して怠惰ではありません。

あなたが持っている例は怠惰かもしれませんが、それをリモート呼び出しを行うものに変更し、リモート呼び出しがいくつかの理由(ネットワークダウン、リモートサービス障害など)で失敗する可能性がある場合は、をチェックしreturn codeてそこにあるかどうかを確認しますエラーだった(Cで行われたように、整数の戻りコードを使用)と、さらに複雑になります。

例外の背後にある考え方は、例外が発生した時点では回復できないエラーを表すということです。

キャッチについてArithmeticExceptionは、ほとんどの場合、怠惰なエラー検出ではなく、悪いプログラミングになると思います(ただし、すべてではありません... 1つは考えられませんが)。

于 2013-01-04T14:39:28.493 に答える
1

例外の主な議論の1つは、例外が通常のフローの外に伝播することです。

あなたの例を使用して:

public String getMyData(int index) {
  String box [] = {"Book", "Pen", "Pencil"};
  return box[index];
}

4の場合はどうしますindexか?メソッドを呼び出すコードは、これに有効な値がないことをどのように認識しますか(多くのメソッドが有効な値として返さnullれる可能性があるため、「usenull」とは言わないでください)。

これが例外の主なユーティリティです。さらに、例外の階層は、それを処理する方法を知っているメソッドによる状況の処理を容易にするのに役立ちます(この例では、呼び出し元のメソッドはnull、例外がスローされた場合に値を使用することに満足している可能性があります。プログラムを停止する必要があります)。

于 2013-01-04T14:39:45.977 に答える
1

Javaでのtry/catchは、予期しない(つまり、あまり一般的ではない)エラーと例外を処理し、その状態をキャッチして処理できるコーディングロジックにプログラミングコンテキストを伝播するためのメカニズムです。

あなたが提供する例は確かにtry/catchの悪い例であり、基本的に怠惰な検証です。悪いコーディング慣行は、ifテストではなくtry/catchで例外をキャッチすることがよくあります。

try / catchにはオーバーヘッドがあり、2番目の例で使用するようなif-testよりもコストのかかる操作です。

if (y != 0) {
  int z = x/y
  // use z value
} else {
  System.out.println(" attempt to divide by 0");
}

I / Oは、例外処理のより良い例を提供します。ほとんどの場合、ファイルを開いてその内容を読み取り、ファイルを閉じることができますが、ファイルがロックされている、存在しない、閉じられないなどの場合があります。I/ Oで問題が発生する可能性のある状態をテストするのではなく、使用できます。 try-catchを使用して、IOExceptionまたはFileNotFoundExceptionをクリーンに処理します。

BufferedReader br = null;
try {
    File file = new File("target.dat");
    br = new BufferedReader(new FileReader(file));  
    String s;
    while ((s = br.readLine()) != null) {
          System.out.println(s);
    }
} catch (IOException ioe) {
    System.err.println("Error: " + ioe);     
} finally {
 if (br != null)
  try {
    br.close();
  } catch(IOException ioe) {
    System.err.println("Error: " + ioe);     
  }
}
于 2013-01-04T14:41:27.990 に答える
0

例外は、例外的な状況、つまり通常の実行中には発生しないはずの状況でのみ使用する必要があります。彼らは捕まえられるべきであり、あなたは実際に彼らについて何かをすることができます。

外部入力の検証など、例外ではない場合は、ifを優先する必要があります。これは、例外がifスローされた場合よりも大幅に遅くなりますが、そうでない場合は実際には速くなる可能性があるためです。

于 2013-01-04T14:39:26.797 に答える
0

作業を試みる前に、すべてのエラーを検証できるわけではありません。たとえば、実際に試すまでWebサイトがページを返すことを検出できますか?

例外なく、呼び出し元にエラーを報告するには、複雑なリターンタイプが必要です。また、エラーを適切に処理する場合、これらの戻りタイプはさらに複雑で複雑になります。

例外は、エラーを適切に処理し、スタックを巻き戻すための優れた方法です。しかし、それはどこかで止まらなければならず、どこかであなたが必要とするところですcatch

于 2013-01-04T14:43:08.277 に答える