当前位置: 首页 > 面试题库 >

Java未检查/检查的异常说明

姜博
2023-03-14
问题内容

我一直在阅读有关未解决问题和已解决问题的信息,没有一个在线资源真正了解它们之间的区别以及何时使用两者。

据我了解,它们都在运行时抛出,它们都表示超出逻辑预期范围的程序状态,但是必须显式捕获已检查的异常,而未检查的异常则不能。

我的问题是,假设出于参数考虑,我有一个将两个数字相除的方法

double divide(double numerator, double denominator)
{    return numerator / denominator;    }

以及需要在某处划分的方法

void foo()
{    double a = divide(b, c);    }

谁负责检查分母为零的情况,应该检查还是取消检查异常(忽略Java的内置divison检查)?

因此,除法将按原样声明为

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是否应该立即检查不正确的值,或者内部逻辑是否应该在计算期间捕获它们并引发异常。


问题答案:

确实有趣的话题!

在阅读并尝试了多种方法来处理一般错误和异常之后,我特别了解了 程序员错误预期错误 之间的区别。

程序员的错误 绝不应该被发现,而应尽早而艰难地崩溃(!)。程序员错误是由于逻辑故障引起的,根本原因应得到解决。

*应始终捕获 *预期的错误 。同样,当捕获到预期的错误时,必须为用户显示一条消息。这有一个重要的含义-
如果预期的错误不应显示错误,则最好检查该方法是否将抛出而不是让其抛出。

因此,将其应用于您的示例时,我会认为“用户应该如何看待?”

  1. 如果应该显示错误消息(在浏览器输出,控制台,消息框中),我将抛出一个异常并将其捕获到 尽可能靠近UI的位置 ,然后输出错误消息。
  2. 如果没有错误消息显示,我将检查输入内容而不抛出错误。

在阿里纳斯:我从来不扔DivideByZeroException也不是NullPointerException-我让JVM抛出那些对我来说。在这种情况下,您可以酿造自己的异常类或使用合适的内置检查异常。



 类似资料:
  • 问题内容: 我在理解Java 和异常之间的区别时遇到了一些问题。 首先,异常应该在编译时寻找异常。在不同来源中提供的示例引用了数据库连接性,其中一些是文件处理,而异常应该是在程序员方面寻找错误,例如索引超出数组范围等。 不应该反过来吗?我的意思是,数据库连接是在运行时完成的,对吧?文件处理也是如此。您没有在编译时打开文件句柄,那么为什么在编译时会寻找一个可能的错误呢?另一方面,超出数组范围的索引已

  • 因为Java编程语言不需要捕获方法或声明未检查异常(包括 RuntimeException、Error及其子类),程序员可能会试图编写只抛出未检查异常的代码,或使所有异常子类继承自RuntimeException。这两个快捷方式都允许程序员编写代码,而不必担心编译器错误,也不用担心声明或捕获任何异常。虽然这对于程序员似乎很方便,但它避开了捕获或者声明异常的需求,并且可能会导致其他人在使用您的类而产

  • 问题内容: 据我了解,如果不逐一查找API文档,就无法找出方法抛出的异常。 由于这是没有选择的,因此我想撤消研究,并询问您在处理时遇到的最常见的Exception和RuntimeException: 铸件 数组 向量,ArrayList,HashMap等 IO(文件类,流,过滤器…) 对象序列化 线程(wait(),sleep()等) 或任何其他被视为“基本Java”的内容 我意识到这可能是主观的

  • 问题内容: 约书亚·布洛赫(Joshua Bloch)在《有效的Java》中说 将检查的异常用于可恢复的条件,将运行时异常用于编程错误(第二版中的项目58) 让我们看看我是否正确理解了这一点。 这是我对检查异常的理解: 1.以上是否被视为经过检查的异常? RuntimeException是未经检查的异常吗? 这是我对未经检查的异常的理解: 4.现在,上面的代码难道不是一个检查过的异常吗?我可以尝试

  • 我有以下两个示例,我不清楚java.lang.Exception是如何处理的:作为检查的或未检查的异常。 以下方法编译成功: 在这里,我认为java.lang.Exception是威胁java.lang.RuntimeException或java.lang.Error。不处理也可以声明扔。 如果我们没有使用异常,而是使用了检查异常(它是java.lang.Exception的子类),那么您必须在方

  • 问题内容: 我在Java中有这个工厂方法: 我想将两个已检查的异常转换为未检查的异常。最好的方法是什么? 我是否应该仅捕获异常并使用捕获的异常作为内部异常抛出新的RuntimeException? 有没有更好的方法可以做到这一点?或者我应该首先尝试这样做吗? 编辑: 只是为了澄清。这些异常将是致命的,因为配置文件实质上是程序的运行,所有异常都将在程序的顶层捕获并记录。 我的目的是避免不必要的引发异