我必须创建 while 循环来处理两个计数器值,这两个计数器值引用两个不同的最大计数器值 就像,i 和 j = 1,iMax=2 和 jMax=3
While循环包含抛出两种不同类型异常的代码,异常1增加计数器i,异常2增加计数器j
计数器达到最大限制后抛出异常
建议处理 While 循环的最有效方法
我已经尝试过,
While(i<=iMax && j<=jMax) {
// process
catch(Exception1 ex) {
if(i==iMax) throw ex;
i++;
}
catch(Exception2 ex) {
if(j==jMax) throw ex;
j++;
}
}
此代码片段存在许多问题,可能会导致代码的功能和可维护性问题。
首先,抑制异常(就像您的例子一样)违背了 Java 中检查异常的预期用途。检查异常旨在表示方法的调用者应适当处理的预期异常情况。通过在没有适当处理的情况下抑制它们,您可以有效地忽略潜在的错误,这可能会导致意外的行为或数据损坏。
当任何异常发生时,被调用的方法负责创建一个带有堆栈跟踪的错误对象。抛出这个异常是一个复杂且昂贵的操作。 JVM 经过优化,可以在不发生异常的情况下保持快速运行。例外应该是例外。
此代码片段中缺乏显式迭代控制可能会导致无限循环。虽然每次执行代码时可能不会发生异常,但不能保证这种行为。
下面的代码片段是您意图的重构版本,您基本上尝试计算 type1 和 type2 类型的异常发生的次数,并且如果任何类型的异常达到其最大值,您将抛出它。
While(i<=iMax && j<=jMax) {
// process
} catch (ArithmeticException | NumberFormatException ex) {
if (i == iMax || j == jMax) throw ex;
if (ex instanceof ArithmeticException)
i++;
else
j++;
}
}
}