我一直在阅读关于未经检查和已检查的问题,没有一个在线资源真正清楚这些差异以及何时使用两者.
根据我的理解,它们都会在运行时抛出,它们都代表超出逻辑预期范围的程序状态,但必须明确捕获已检查的异常,而未经检查的异常则不会.
我的问题是,假设为了论证我有一个方法来划分两个数字
double divide(double numerator,double denominator) { return numerator / denominator; }
以及需要在某处使用divison的方法
void foo() { double a = divide(b,c); }
谁负责检查分母为零的情况,是否应该检查或取消检查异常(忽略Java内置的分区检查)?
那么,除法方法是按原样还是按原样声明
double divide(double numerator,double denominator) throws DivideByZeroException { if(denominator == 0) throw DivideByZeroException else ... } void foo() { try{ double a = divide(b,c); } catch(DivideByZeroException e) {} }
或者没有经过检查的例外,原样如下:
double divide(double numerator,double denominator) { if(denominator == 0) throw DivideByZeroException else ... } void foo() { if(c != 0) double a = divide(b,c); }
并允许foo通过零检查进行除法?
这个问题最初出现在我写的数学程序中,用户输入的数字和逻辑类执行计算.我不知道GUI是否应该立即检查不正确的值,或者内部逻辑是否应该在计算期间捕获它们并抛出异常.
解决方法
有趣的话题确实!
在阅读并尝试了很多方法来处理一般错误和异常后,我学会了程序员错误和预期错误之间的区别.
程序员错误永远不应该被捕获,而是早期和困难地崩溃(!).程序员错误是由逻辑错误引起的,应该修复根本原因.
应始终捕获预期的错误.此外,当捕获到预期错误时,必须为用户显示一条消息.这有一个重要的含义 – 如果预期的错误不应该显示错误,最好检查方法是否会抛出而不是让它抛出.
所以应用到你的例子我会想“这应该如何看待用户?”
>如果应该显示错误消息(在浏览器输出,控制台,消息框中),我会抛出一个异常,并尽可能靠近UI捕获它并输出错误消息.
>如果不显示错误信息,我会检查输入而不是抛出.
旁注:我从不抛出DivideByZeroException或NullPointerException – 我让JVM为我抛出这些东西.在这种情况下,您可以酿造自己的异常类或使用合适的内置检查异常.