我想继续生成错误的下一行,
try{
statement A;
statement B;
statement C;
}
catch(NullPointerException NPE){.....}
现在假设我的语句 A 抛出异常,所以我想跳过它并继续 B。不要提出我的建议,即放入 catch/finally 块或任何其他解决方案。我只想知道这是否可以跳过并继续下一条语句?
我想继续生成错误的下一行,
try{
statement A;
statement B;
statement C;
}
catch(NullPointerException NPE){.....}
现在假设我的语句 A 抛出异常,所以我想跳过它并继续 B。不要提出我的建议,即放入 catch/finally 块或任何其他解决方案。我只想知道这是否可以跳过并继续下一条语句?
是的,没有finally
块是可能的。
try{
statement A;
}
catch(NullPointerException NPE){.....}
try{
statement B;
}
catch(NullPointerException NPE){.....}
try{
statement C;
}
catch(NullPointerException NPE){.....}
顺便说一句,我真的不认为这很好。如果您设法达到需要这种流控制的地步,您需要退后一步,重新考虑您的代码设计。
如果 A 抛出异常,则无法执行语句 B。一种方法是单独尝试/捕获块,另一种方法是将其他行放入 finally 块中。
如果您的语句相似并且可以参数化,请使用循环:
for (int i = 0; i < statementCount; i++) {
try {
/** do what you need */
} catch(Exception e) {
}
}
如果需要更多参数,或者将其放在单独的方法中:
public static void main(String[] args) {
for (int i = 0; i < statementCount; i++) {
}
execute(params);
}
public void execute(Object... objects) {
try {
doSomthing(objects[0], objects[1]);
} catch(Exception e) {
}
}
如果语句完全不同,Java 8 提供了有趣的解决方案:方法引用和 lambdas。所以你可以像这样玩arround:
public static void main(String[] args) {
execute(someObject, YourClass::method);
}
public void execute(Object param, Function<Object, Void> function) {
try {
function.apply(param);
} catch(Exception e) {
}
}
就像 darijan 已经提到的那样,您可以将每条语句放入自己的 try-catch 中。或者,如果您知道可能导致异常的原因,您可以在执行语句之前简单地检查它
try{
if(parameterForStatementA != null) {
statementA;
}
if(parameterForStatementB != null) {
statementB;
}
if(parameterForStatementC != null) {
statementC;
}
} catch(Exception e) {
// something unexpected happened
}
验证参数通常比捕获抛出的异常更有效