2

私は次のようなコードを持っています:

try {
    if (resp.equals("a")) {
       success(resp);
   } else if (resp.equals("b")) {
       throw new Exception("b error");
   } else if (resp.equals("c")) {
       throw new Exception("c error");
   }

} catch (Exception e) {
    dosomething(e.getMessage());
}

私のcatchステートメントはエラーをキャッチしません...tryブロックの外に出る例外をスローするときに何か間違ったことをしていますか?

4

6 に答える 6

3

すべてのブロックを使用して文字列を比較しているため、if-elseブロックは実行されません==。その場合、tryブロックはまったくスローexceptionしません。

メソッドを使用equalsして、すべてのケースで文字列を比較します。

if (resp.equals("a"))

また:

if ("a".equals(resp))   // Some prefer this, but I don't

2 番目の方法は を回避NPEしますが、潜在的な例外について知らず、後でトラップに陥る可能性があるため、通常はこれを使用しません。

于 2013-02-13T18:39:02.703 に答える
2

上記のコードを使用して、欠落している変数と if ブロックの最後に追加された「else」句 (および何が起こっているかを確認するための出力) を次のように追加します。

String resp = "b";
boolean success;
try {
    if (resp.equals("a")) {
       System.out.println("in a");
    } else if (resp.equals("b")) {
       throw new Exception("b error");
    } else if (resp.equals("c")) {
       throw new Exception("c error");
    } else System.out.println("ended with no match");

} catch (Exception e) {
    e.printStackTrace();
}

String resp の値が「b」または「c」の場合、期待どおりにエラーがスローされます。resp の値が「a」の場合、「in a」も出力されます。

末尾にelse句がないため、a、b、またはcのいずれにも一致しない場合、if/elseブロックを終了して何もしません。例外をスローしているコードに遭遇していないため、例外はスローされません。

resp 変数にこれらの値のいずれかがあると確信していますか?

于 2013-02-13T18:55:05.763 に答える
2

問題は、if-else 構造で処理されない resp である可能性が最も高いと思います。コードを簡単なテスト プログラムに入れました。

public class Test {

  public static void main(String[] args) {
    test("a");
    test("b");
    test("c");
    test("d");
  }

  private static void test(String resp) {
    System.out.println("Testing: " + resp);
    try {
      if (resp.equals("a")) {
        success(resp);
      } else if (resp.equals("b")) {
        throw new Exception("b error");
      } else if (resp.equals("c")) {
        throw new Exception("c error");
      }

    } catch (Exception e) {
      System.out.println("Caught: " + e.getMessage());
    }
  }

  private static void success(String resp) {
    System.out.println("Success");
  }

}

出力は次のとおりです。

Testing: a
Success
Testing: b
Caught: b error
Testing: c
Caught: c error
Testing: d

「a」、「b」、または「c」のいずれかで「成功」または例外が発生しましたが、「d」では発生しませんでした。resp が処理している値の 1 つを持たないプログラムのケースを探すことをお勧めします。

于 2013-02-13T19:24:50.320 に答える
1

==ワイルドな推測:文字列をの代わりにと比較しているため、例外をスローするブランチは実行されませんequals

追加する場合

else {
    System.out.println("in else block???");
}

ブロックを試してみると、ライブでそれがわかります...

于 2013-02-13T18:38:39.540 に答える
0

はい、あなたは何か間違ったことをしています。文字列を と比較しないで==、 を使用してください。equals

于 2013-02-13T18:39:31.970 に答える
0

s を使用しExceptionて条件を制御しています。これは悪い習慣であり、実際には just を使用する必要がありますif-else。だから、このようなもの:

   if (resp.equals("a")) {
       success(resp);
   } else if (resp.equals("b")) {
       dosomething("b error");
   } else if (resp.equals("c")) {
       dosomething("c error");
   }

次のようなこともできます

enum Foo {a,b,c}

そして、このようなきれいなことをします

switch(Foo.valueOf(resp){ // throws an IllegalArgumentException if it isn't a, b, or c
  case a: ...
  case b: ...
  case c: ...
}

これが役に立ち、より良いプログラマーになることを願っています。

于 2013-02-13T18:54:10.113 に答える