当前位置: 首页 > 知识库问答 >
问题:

关于java的编译时异常与运行时异常,ParseException是编译时异常,为什么编译阶段不报错,运行时报错?

潘修文
2024-07-15

例如如下代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse("abcd");

这段代码会抛出ParseException,而它是编译时异常,为什么编译阶段不报错,运行时报错?

共有3个答案

钦永贞
2024-07-15

image.png
JAVA里的受检性异常,也就是你说的编译时异常,意思是在编译时期(也就是你写代码的时候)要求程序员对可能发生的异常作出处理,你可以try..catch..处理也可以直接throws异常处理(如果你选择二者都不做,就会提示异常,如图),但是并不是说程序员作的处理就一定不会导致异常的发生。
也就是说编译时异常需要你强制性对代码风险做一定规范,但是不能在编译时期就对你作出的处理就作出是否会导致异常的判断,如果你处理的有问题,该怎么导致异常还是会怎么导致异常。

明安阳
2024-07-15

image.png

有个错误说法:继承RuntimeExcetion的是运行时异常,继承Exception的是编译时异常。

只是在编译阶段,对RuntimeExcetion以及子类有点特殊处理,不检查你有没有写try catch

编译异常与运行时异常,是一种描述,跟具体类没有关系。Exception那么多子类,带Parse的,应该都是运行时参数不对才会报错。

我们可以认为全都是Exception。他的那么多子类是为不同场景使用时好区分堆栈信息,让你一眼看出代码哪个地方出问题了。一般业务开发的时候,我们也会定义一个或多个自己的某业务专用异常。

其实不用纠结编译时运行时,把所有异常都按需处理好才是正确稳妥的。

颜修真
2024-07-15

首先,我们需要澄清一点:在Java中,ParseException 并不是编译时异常(checked exception),而是运行时异常(unchecked exception)。编译时异常是指那些必须在编译时被捕获或者声明的异常,这些异常都是 Exception 类(或其子类,但非 RuntimeException 或其子类)的直接或间接子类,并且没有被标记为 @FunctionalInterface 注解的方法中的 lambda 表达式或方法引用所抛出。

对于 ParseException,它是 java.text.ParseException 类的一个实例,该类继承自 java.lang.Exception 而非 java.lang.RuntimeException。然而,Java设计者选择让 ParseException 成为一个运行时异常,这意味着它不需要在代码中显式捕获或声明。这种设计选择是为了简化API的使用,因为对于许多文本解析操作,解析失败是常见的运行时情况,而不是编程错误。

现在,让我们回到你的问题:为什么 ParseException 在编译阶段不报错,而在运行时报错?

原因是 ParseException 是一个运行时异常,编译器不会强制你捕获或声明它。这意味着你可以编写代码来调用可能抛出 ParseException 的方法,而无需在调用代码中包含任何异常处理代码。然而,当这段代码运行时,如果实际上发生了 ParseException(例如,在你的例子中,尝试将字符串 "abcd" 解析为日期时),Java运行时环境将抛出一个 ParseException 异常,这通常会导致程序的中断(除非有某种形式的异常处理来捕获并处理它)。

为了处理这种运行时异常,你可以使用 try-catch 块来捕获 ParseException 并相应地处理它。但是,由于 ParseException 是一个运行时异常,所以这不是必须的。

以下是处理 ParseException 的一个示例:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
try {
    Date date = sdf.parse("abcd");
} catch (ParseException e) {
    e.printStackTrace(); // 或者其他异常处理逻辑
}

在这个例子中,我们使用了 try-catch 块来捕获并处理 ParseException。但是,请注意,即使我们没有这个 try-catch 块,代码也能成功编译,因为它不是编译时异常。

 类似资料:
  • 在Android Studio的编译过程中,我得到了时间异常错误。我该怎么修好它?

  • 我有一个超类动物和两个子类:猫和狗。Dog类有一个专属于它自己的新方法,称为playFetch()。 在运行时,我们知道会发生什么。请说服我为什么编译器不抱怨。还是我的论点正确?

  • 我在一个类中有一个方法,该方法具有使用泛型指定的返回类型。 对于通用返回类型,我假设上面示例中的返回将评估为: 相反,被正确返回和打印。 如果我将调用更改为: 我错过了什么,以帮助我理解这里发生了什么,为什么原始版本没有导致编译错误。

  • 问题内容: 如果我创建一个不实现Comparable的任意类,并尝试将其用作树集,则在插入对象时,它将在运行时引发异常: 我不是Java专家,但是关于此的某些事情似乎以我所没有想到的方式进行了动态类型化(例如Python)。TreeSet的实现没有办法指定其泛型类型参数必须实现Comparable以便可以在编译时捕获它吗?非泛型函数可以将接口作为参数。泛型不一样吗? 问题答案: 之所以这样实现是因

  • 问题内容: 我在类中有一个方法,该方法具有通过使用泛型指定的返回类型。 对于通用返回类型,我假设以上示例中的返回将计算为: 而是返回a并正确打印。 如果将调用更改为:我收到编译错误: 我缺少什么来帮助我了解这里发生了什么以及为什么原始版本没有导致编译错误。 问题答案: 这是因为重载解析解决了您的调用,因为没有。 请记住,Java的泛型会在运行时删除。像这样的演员阵容将被删除,并移至呼叫站点。有时这

  • 问题内容: 我正在尝试使用JavaMail API发送电子邮件。我从自解压二进制文件在我的主目录中安装了jdk 1.5。我正在使用Ubintu 9.10 我使用下一条命令编译程序: 〜/ jdk1.5.0_22 / bin / javac -classpath〜/ jdk1.5.0_22 / jre / lib / javamail-1.4.3 / mail.jar:〜/ jdk1.5.0_22

  • 本文向大家介绍浅谈异常结构图、编译期异常和运行期异常的区别,包括了浅谈异常结构图、编译期异常和运行期异常的区别的使用技巧和注意事项,需要的朋友参考一下 异常处理一般有2种方式,要么捕获异常try-catch,要么抛出异常throws 如果一个方法后面抛出一个运行时期异常(throws RuntimeException),调用者无须处理 如果一个方法后面抛出一个编译时期异常,调用者必须处理,或者抛出

  • 问题内容: 通常,如果有任何类extends ,它将成为检查异常。还扩展了Exception。那么它是如何? 难道他们在这种特殊情况下会在 编译器中 自定义检查? 编辑: 我对已 检查的v / s未检查的异常 以及它们的优缺点等有适当的了解。我不接受它们之间的区别。 问题答案: 在规范的第11.1.1节中有明确规定: 及其所有子类共同是 运行时异常类 。 在 未经检查的异常类 是运行时异常类和错误