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

第二种方法会避免NPE,但通常我会避免使用它,因为我不知道潜在的异常,并且以后可能会陷入陷阱。

于 2013-02-13T18:39:02.703 回答
2

我认为问题很可能是 if-else 结构未处理的响应。我将代码放在一个简单的测试程序中:

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 没有你正在处理的值之一的情况。

于 2013-02-13T19:24:50.320 回答
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 回答
1

疯狂的猜测:您抛出异常的分支永远不会运行,因为您将字符串与==而不是equals.

如果您添加一个

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

在你尝试块中,你会在现场看到......

于 2013-02-13T18:38:39.540 回答
0

您正在使用Exceptions 来控制条件。这是一个不好的做法,你真的应该使用 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 回答
0

是的,你做错了什么。不要将字符串与 进行比较==,使用 .equals

于 2013-02-13T18:39:31.970 回答