标签: multi-catch

我可以在同一个catch子句中捕获多个Java异常吗?

在Java中,我想做这样的事情:

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}
Run Code Online (Sandbox Code Playgroud)

...代替:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

java exception try-catch multi-catch

668
推荐指数
6
解决办法
46万
查看次数

确定编译时多包异常类型

我建造了一些我不太懂的东西 - 我不知道它是如何工作的.我已经熟悉了这篇关于多篇解释的文章.

考虑这两个例外和代码:

public class MyException1 extends Exception {
  // constructors, etc
  String getCustomValue();
}

public class MyException2 extends Exception {
  // constructors, etc
  String getCustomValue() { return "foo"; }
}

try {
  //...
} catch (MyException1|MyException2 e) {
  e.getCustomValue(); // won't work, as I expected
}
Run Code Online (Sandbox Code Playgroud)

我将无法调用getCustomValue(),即使方法是相同的,因为在Java中,上面try/catch应该实际上是在转换MyException1/2Exception(这就是我理解文档的方式).

但是,如果我引入这样的界面:

public interface CustomValueGetter {
  String getCustomValue();
}

public class MyException1 extends Exception implements CustomValueGetter /*...*/
public class MyException2 extends Exception …
Run Code Online (Sandbox Code Playgroud)

java exception try-catch java-7 multi-catch

13
推荐指数
1
解决办法
437
查看次数

组合lambdas和multi-catch子句时的Java bug?

import java.io.*;             
import java.net.*;            

public class Test {           
    public static void main(String[] arguments) throws Exception {
        Runnable runnable = () -> {
            try {
                throwException();
            }
            catch (SocketException|EOFException exception) {
                System.err.println("wrong");
            }
            catch (IOException exception) {
                System.err.println("right");
            }
        };

        runnable.run();
    }                         

    private static void throwException() throws IOException {
        throw new NotSerializableException();
    }                         
}
Run Code Online (Sandbox Code Playgroud)

为什么这个程序打印"错误"?如果我删除了lambda,或者如果我拆分了multi-catch子句,那么它会打印"right".

$ javac -version
javac 1.8.0_11
$ java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
Run Code Online (Sandbox Code Playgroud)

java lambda exception java-8 multi-catch

11
推荐指数
2
解决办法
343
查看次数

Maven项目错误:-source 1.5中不支持Diamond/multicatch运算符

由于以下两个错误,我无法构建我的maven java Web应用程序:

diamond operator is not supported in -source 1.5
  (use -source 7 or higher to enable diamond operator)

multi-catch statement is not supported in -source 1.5
  (use -source 7 or higher to enable multi-catch statement)
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为我使用java 1.8.0作为我的项目,我从来没有实际使用过1.5

在此输入图像描述

在此输入图像描述

什么可能导致这个问题,我该如何解决?

我在pom.xml中添加了以下行后尝试构建它,但没有成功:

 <properties>
        <sourceJdk>1.8</sourceJdk>
        <targetJdk>1.8</targetJdk>
 </properties>
Run Code Online (Sandbox Code Playgroud)

java diamond-operator maven web multi-catch

11
推荐指数
1
解决办法
9751
查看次数

为什么Java中的多捕获功能要求异常是最终的?

关于添加到Java 7 的多捕获功能的Oracle文档声明该catch子句中的异常参数是隐式的final.

我的问题是:这种限制有什么意义?因为我似乎无法找到它带来的一个重要改进.将引用对象标记为final仅保护引用本身不被修改,而不是它引用的对象,并且永远不会禁止创建另一个引用并以任何他们想要的方式修改它.

关于SO的一个有点相关的问题讨论了为什么修改catch子句中的异常引用不是最明智的事情,但它涉及到该子句的任何使用catch,而不仅仅是它的多捕获形式.那么为什么Java会为多重捕获制造一个例外,并以特殊的方式对待它?

谢谢!

java exception java-7 multi-catch

11
推荐指数
1
解决办法
695
查看次数

是否有Java 7的组合/多捕获块的正式名称?

在讨论多捕捉/混合catch块在这里与术语之间的模糊"多catch块",意思是Java 7的特性:

try { .. } catch (ExceptionA | ExceptionB ex) { .. }
Run Code Online (Sandbox Code Playgroud)

和"多个捕获块",意思是字面上,多个捕获块:

} catch (ExceptionA exa) { ..
} catch (ExceptionB exb) { .. }
Run Code Online (Sandbox Code Playgroud)

我已经研究过,看看Java 7功能是否有一个特定的官方名称,可以用它来清楚地区分它与捕获多个异常的旧方式.但是,Oracle 资源似乎并没有在任何地方命名这个功能,而其他一些来源(如EclipseSO)称之为"多捕获"块.

是否有任何官方的,Oracle给出的此功能名称?

java naming multi-catch

10
推荐指数
1
解决办法
124
查看次数

为什么Java multi-catch不能处理与子类相关的类型?

这是一段不能编译的代码:

void multiCatch()
{
    try {
        throwIOFile();
    }
    // FileNotFoundException extends IOException, hence this
    // does not compile ("alternatives" related by sub classing):
    catch (IOException | FileNotFoundException e) { }
}

void throwIOFile() throws IOException, FileNotFoundException
{}
Run Code Online (Sandbox Code Playgroud)

一切都像魅力一样,没有与子类别相关的异常类型.如果您IOException在我的代码片段中交换说.. SQLException,它可以工作.该规范内容如下:

如果类型的并集包含两个备选Di和Dj(i≠j),则其是编译时错误,其中Di是Dj的子类型.

我无法理解这背后的理由.当然,我的例子中的多次捕获是完全多余的,因为我也可以只捕获一个IOException.但是,使我的代码片段合法会有什么危害?当然,违法行为必然会造成伤害吗?

java types java-7 multi-catch

9
推荐指数
2
解决办法
4284
查看次数

无法在IntelliJ中定义多次捕获

我在Intellij 12.0.4中使用JDK 7.当我尝试创建一个多捕获块时,会出现"此语言级别不支持多捕获"错误.我发现了这个问题,但答案对我不起作用.这就是答案:

单击文件菜单,打开项目结构,然后在"设置"下应该有"项目".在该选项卡中,将有一个SDK设置选项,指定您要使用的语言版本.有关详细信息,请参阅JetBrains帮助页面("项目语言级别").

java intellij-idea java-7 multi-catch

7
推荐指数
2
解决办法
5545
查看次数

无法有效地使用Java中的Multi Catch

我真的想使用Java-1.7的功能.其中一个功能是"Multi-Catch".目前我有以下代码

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

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

    updateTotalCount(tempTypeInfo);
} catch (NumberFormatException numExcp) {
    numExcp.printStackTrace();
} catch (Exception exception) {
    exception.printStackTrace();
} 
Run Code Online (Sandbox Code Playgroud)

我想从上面的代码中删除两个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();
} 
Run Code Online (Sandbox Code Playgroud)

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

"NumberFormatException"已被替代Exception捕获.

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

java exception try-catch numberformatexception multi-catch

7
推荐指数
1
解决办法
3912
查看次数

何时使用多捕获以及何时使用重新抛出?

我对这两个主题非常不确定.我知道我应该使用multi-catch来处理需要以相同方式处理的异常.但出于什么目的,我真的需要这样的东西.

private void something(String name) throws IOException, RemoteException {
    try {
        ...
    } catch (Exception ex) {

        ... // do something

        throw ex;
    }
}
Run Code Online (Sandbox Code Playgroud)

java rethrow multi-catch

5
推荐指数
1
解决办法
259
查看次数

多捕获异常处理程序中的顺序

我知道自从Java 7你可以使用multi-catch但是我想知道它的异常顺序是否与之前版本的java一样重要?例如,我把异常,然后SQLExceptionIOException

try {
      // execute code that may throw 1 of the 3 exceptions below.

} catch(Exception | SQLException | IOException e) {   
    logger.log(e);

}
Run Code Online (Sandbox Code Playgroud)

或者我应该这样做?

try {

    // execute code that may throw 1 of the 3 exceptions below.

} catch(SQLException | IOException e) {
    logger.log(e);

} catch(Exception e) {
    logger.severe(e);
}
Run Code Online (Sandbox Code Playgroud)

java exception-handling exception multi-catch

3
推荐指数
2
解决办法
2735
查看次数