在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)
有没有办法做到这一点?
我建造了一些我不太懂的东西 - 我不知道它是如何工作的.我已经熟悉了这篇关于多篇解释的文章.
考虑这两个例外和代码:
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/2为Exception(这就是我理解文档的方式).
但是,如果我引入这样的界面:
public interface CustomValueGetter {
String getCustomValue();
}
public class MyException1 extends Exception implements CustomValueGetter /*...*/
public class MyException2 extends Exception …Run Code Online (Sandbox Code Playgroud) 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) 由于以下两个错误,我无法构建我的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) 在讨论多捕捉/混合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 资源似乎并没有在任何地方命名这个功能,而其他一些来源(如Eclipse和SO)称之为"多捕获"块.
是否有任何官方的,Oracle给出的此功能名称?
这是一段不能编译的代码:
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.但是,使我的代码片段合法会有什么危害?当然,违法行为必然会造成伤害吗?
我在Intellij 12.0.4中使用JDK 7.当我尝试创建一个多捕获块时,会出现"此语言级别不支持多捕获"错误.我发现了这个问题,但答案对我不起作用.这就是答案:
单击文件菜单,打开项目结构,然后在"设置"下应该有"项目".在该选项卡中,将有一个SDK设置选项,指定您要使用的语言版本.有关详细信息,请参阅JetBrains帮助页面("项目语言级别").
我真的想使用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捕获.
我理解上面的编译时错误但是我的第一个代码块的替换是什么.
我对这两个主题非常不确定.我知道我应该使用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 7你可以使用multi-catch但是我想知道它的异常顺序是否与之前版本的java一样重要?例如,我把异常,然后SQLException和IOException?
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)