前面介绍的几种异常(不包含错误),编码的时候没认真看还发现不了,直到程序运行到特定的代码跑不下去了,程序员才会恍然大悟:原来这里的代码逻辑有问题。像这些在运行的时候才暴露出来的异常,又被称作“运行时异常”,与之相对的另一类异常叫做“非运行时异常”。所谓非运行时异常,指的是在编码阶段就被编译器发现这里存在潜在的风险,需要开发者关注并加以处理。比如把某个字符串转换成日期类型,用到了SimpleDateFormat实例的parse方法,倘若按照常规方式编码,则编译器会在parse这行提示代码错误,并给出如下图所示的处理建议小窗。
可见编译器提供了两种解决办法,第一种是“Add throws declaration”,表示要添加throws声明;第二种是“Surround with try/catch”,表示要用try/catch语句把parse行包围起来。为了消除编译错误,姑且先采用第一种解决方式,给parse行所在的方法添加“ throws ParseException”,下面是修改后的演示代码:
// 解析异常:指定日期不是真实的日子
// ParseException属于编译时异常,在编码时就要处理,否则无法编译通过。
// 处理方式有两种:一种是往外丢异常,另一种是通过try...catch...语句捕捉异常
private static void getDateFromFormat() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2021/02/28";
Date date = sdf.parse(strDate);
}
然而不光是上面的getDateFromFormat方法需要添加throws声明,连该方法所在的main方法也要添加throws声明才行。好不容易把该加的throws语句全都加了,接着故意填个格式错误的日期字符串,运行这个格式转换代码,果然程序输出了异常信息“java.text.ParseException: Unparseable date: “2021/02/28””。
不过手工添加throws实在麻烦,得从调用parse的地方开始一层一层往上加过去,改动量太大。那么再试试编译器提供的第二种解决方式,也就是parse这行增加try/catch语句块,具体代码示例如下:
// 通过try...catch...语句捕捉日期的解析异常
private static void getDateWithCatch() {
SimpleDateFormat sdf = new Si