Java未经检查/检查异常澄清

我一直在阅读关于未经检查和已检查的问题,没有一个在线资源真正清楚这些差异以及何时使用两者.

根据我的理解,它们都会在运行时抛出,它们都代表超出逻辑预期范围的程序状态,但必须明确捕获已检查的异常,而未经检查的异常则不会.

我的问题是,假设为了论证我有一个方法来划分两个数字

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为我抛出这些东西.在这种情况下,您可以酿造自己的异常类或使用合适的内置检查异常.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量