8

我真的很想使用 Java-1.7 的特性。此功能之一是“多捕获”。目前我有以下代码

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (NumberFormatException numExcp) {
    numExcp.printStackTrace();
} catch (Exception exception) {
    exception.printStackTrace();
} 

我想从上面的代码中删除两个 catch 块,而是使用如下的单个 catch:

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (Exception | NumberFormatException ex) { // --> compile time error
    ex.printStackTrace();
} 

但是上面的代码给出了编译时错误:

“NumberFormatException”已被替代异常捕获。

我理解了上面的编译时错误,但是我的第一个代码块的替换是什么。

4

7 回答 7

11

NumberFormatException是 的子类Exception。说两个catch块应该具有相同的行为就像说你没有任何特殊处理NumberFormatException,只是你有相同的一般处理Exception。在这种情况下,您可以省略它的catch块并且仅catch Exception

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (Exception exception) {
    exception.printStackTrace();
} 
于 2015-09-02T05:36:29.600 回答
3

编译器告诉你

} catch (Exception ex) {

也会捕获NumberFormatException异常,因为java.lang.NumberFormatExceptionextends java.lang.IllegalArgumentException,which extends java.lang.RuntimeException,最终extends java.lang.Exception

于 2015-09-02T05:37:31.167 回答
2

multi-catch 中的类型必须是不相交的,并且java.lang.NumberFormatExceptionjava.lang.Exception.

于 2015-09-02T05:37:27.730 回答
2

添加到 Mureinik 的解决方案:

如果您想区分每个子类的错误处理,您可以instanceof在 catch 块中使用,例如:

FileNotFoundException is subclass of IOException

catch (IOException e) {
            if (e instanceof FileNotFoundException)
            {
                System.out.println("FileNotFoundException");
            }
            else if(e instanceof IOException)
            {
                System.out.println("IOException");
            }

        }
于 2016-11-15T06:01:36.637 回答
1

在这种情况下,不需要 multi-catch,因为NumberFormatException它派生自Exception. 您可以简单地抓住Exception它们以获取它们。如果您需要NumberFormatException对其他异常进行其他处理,则必须使用您首先发布的示例。

于 2015-09-02T05:37:00.907 回答
1

您可以使用

    try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
  } catch (Exception exception) {
    exception.printStackTrace();
  } 
于 2015-09-02T05:37:04.987 回答
0

Exception是所有异常的父类,理想情况下(首选方法 - 最佳编码实践),Exception除非您不确定运行时 try 块中会抛出什么,否则您永远不应该捕获。

因为,在您的代码中,您正在执行 NumberFormat 操作,它是 Exception 的子类,所以您不应该捕获 Exception(除非其他 2 种方法可能会抛出未经检查的异常),而是使用:

try {
    int Id = Integer.parseInt(idstr);
    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));\
    updateTotalCount(tempTypeInfo);
} catch (NumberFormatException npe) {
    npe.printStackTrace();
} 
于 2015-09-02T05:48:05.377 回答