例如如下代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = sdf.parse("abcd");
这段代码会抛出ParseException,而它是编译时异常,为什么编译阶段不报错,运行时报错?
JAVA里的受检性异常,也就是你说的编译时异常,意思是在编译时期(也就是你写代码的时候)要求程序员对可能发生的异常作出处理,你可以try..catch..处理也可以直接throws异常处理(如果你选择二者都不做,就会提示异常,如图),但是并不是说程序员作的处理就一定不会导致异常的发生。
也就是说编译时异常需要你强制性对代码风险做一定规范,但是不能在编译时期就对你作出的处理就作出是否会导致异常的判断,如果你处理的有问题,该怎么导致异常还是会怎么导致异常。
有个错误说法:继承RuntimeExcetion的是运行时异常,继承Exception的是编译时异常。
只是在编译阶段,对RuntimeExcetion以及子类有点特殊处理,不检查你有没有写try catch
。
编译异常与运行时异常,是一种描述,跟具体类没有关系。Exception那么多子类,带Parse的,应该都是运行时参数不对才会报错。
我们可以认为全都是Exception。他的那么多子类是为不同场景使用时好区分堆栈信息,让你一眼看出代码哪个地方出问题了。一般业务开发的时候,我们也会定义一个或多个自己的某业务专用异常。
其实不用纠结编译时运行时,把所有异常都按需处理好才是正确稳妥的。
首先,我们需要澄清一点:在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