在前面我们简单提到了代码层面上的异常处理。有两种方式,第一种方式呢一旦出现异常呢你可以往外抛,那大家都不管,都往外抛。那么还有一种方式呢就是捕获这个异常。那么这两种方式是代码层面上的处理啊,在开发中我们到底应该如何去处理异常。
在Java开发中,异常处理确实主要包括两种方式,:一种是捕获异常后记录日志并响应给用户合适的信息,另一种是捕获异常后尝试进行修复或恢复操作。下面我将详细解释这两种方式,并提供相应的代码示例。
1. 捕获异常,记录异常并响应合适的信息给用户
这种方式通常用于处理那些我们无法预测或者无法立即修复的异常情况。以下是处理异常的一般步骤:
try块:将可能抛出异常的代码放在try块中。如果try块中的代码抛出了一个检查型异常(checked exception),则后续代码不会被执行。栈
try {
// 可能抛出异常的代码
} catch (ExceptionType1 e1) {
// 处理异常的代码
} catch (ExceptionType2 e2) {
// 处理另一个异常的代码
}
catch块:当try块中的代码抛出异常时,控制流转到匹配该异常类型的catch块。你可以有多个catch块来捕获不同类型的异常。
catch (ExceptionType e) {
// 记录日志
Logger.log(e.getMessage());
// 向用户显示友好的错误信息
System.out.println("发生错误,请联系技术支持。");
}
我们来通过代码截图举一个详细的例子
我们在写一个再次调用的方法,然后也出现了异常错误。
接下来我们就把这些异常全部往外抛。
但是很多同学可能会有一个疑惑,就是我内部到底是什么异常要抛呢?如果你不知道的,你可以把鼠标移到这个地方来,按alt键加回车键选第一个,它就会自动帮你把这个内部的异常往外抛。
首先我们将文件找不到这个异常向它的调用者抛出
然后把testOne里面的日期解析异常和testTwo也向外抛
现在所有的异常都抛给了最终的调用者testOne。我们现在就不能再向外抛了,就要捕获这个异常,然后进行处理。
详情见代码
public static void main(String[] args) {
try {
testOne();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
在此基础上我们也可以添加一些提示,让用户更加明白。
public static void main(String[] args) {
try {
testOne();
} catch (FileNotFoundException e) {
System.out.println("对不起,你要找的文件不存在");
e.printStackTrace();//打印出这个异常对象的信息,记录下来。
} catch (ParseException e) {
System.out.println("对不起,你的解析时间出了问题");
e.printStackTrace();//打印出这个异常对象的信息,记录下来。
}
}
首先呢执行这个testOne方法,到这边来呢它会执行这段代码,这个代码是解析时间,该时间没毛病啊,所以他把这个时间直接打印出来了,打完之后呢他会去调这个testTwo方法。但是文件确实不存在。于是呢他就会抛一个文件异常,一直在抛给着最终调用者。到这来之后呢,它就会被我们的这个catch拦截住,文件找不到异常,然后就输出了。
有时候内部具体有什么异常我们也不知道,所以直接抛Exception。因为Exception异常是所有异常的祖中类。拦截的时候也是Exception.
2. 捕获异常,尝试重新修复
这种方式适用于那些可能由于临时问题(如网络问题、资源锁定等)导致的异常,程序可以通过重试或采取其他补救措施来尝试恢复。
接下来我们来看一个例子:
整个过程我们看似合理。但是如果用户他输入的不是数字,而是输入一些字符串。我们该怎么办呢? 我们可以看下面这张图片,程序直接崩溃了。
接下来我们就尝试修复。过程见下边代码图片。
此时我们可以看到如果你不输入合理的价格,它会一直提醒你。
总结: