我创建了自己的异常来处理像算术异常和其他涉及数学规则的情况。但是当我调用它时,例如在除以零的情况下,它从未进入我的异常,而是进入算术异常。
除以零和其他“标准”算术错误由运行时或类库处理,它们不知道您定义的异常。只有在适当时明确地throw
它们时,才能在自己的代码中使用自己的异常。
当然,可以捕获类库抛出的任何算术异常并将其封装成自己的异常:
try {
...
} catch (java.lang.ArithmeticException exc) {
throw new MyException("An arithmetic error occurred", exc);
}
try{
}catch(第一个异常){代码}
catch(我需要的异常){代码}
并且只会进入第一个异常。 - alculete在这些情况下,您将不得不捕获标准的Java异常,并将它们包装在您的异常中。
try {
int x = 10/0;
} catch (ArithmeticException ex) {
throw new MyException("My additional text", ex);
}
通常情况下,除非您还添加了一些额外的细节,否则添加新的异常并不是一个好主意。
是的,因为异常是由JDK源代码抛出的,而不是你。如果你想执行一些自定义逻辑,可以在你的catch DiviedByZeroException
块中重新抛出你自己的异常。
public BigDecimal divide(BigDecimal val1 , BigDecimal val2) { BigDecimal result = val2.divide(val1,99, BigDecimal.ROUND_HALF_UP); return result; }
在第二个类中:try{ ...} catch (Exception e) { throw new EvaluatorException(expression); }catch(MyOnException){ ... }
- alculeteMyOnException
之后,您需要捕获Exception
。Java将执行可以从抛出的异常进行转换的第一个catch块。任何在catch(Exception e)
之后的catch块都无法到达。 - Ryan Grosscatch(Exception e)
,那么就没有办法捕获我的异常。 - alculetecatch
块的顺序。即先捕获MyOnException
,然后是Exception
。 - Péter Török