异常分类
- 我把异常分为两种情况:一种是我要处理的&别人抛出的异常;另外一种是我没法处理时我要抛出的异常.
别人抛出的异常
对于此种异常的解决方案大致分为两种:throws || try…catch…(finally…).如果自己也处理不了所抛出的异常,那么使用throws对上层进行通知;如果在此时能够处理当前的异常,则使用try…catch来实现对异常的处理.
throws Demo
假设读取文件抛出的异常我不会处理,那么我会选择直接抛出.
import java.io.FileNotFoundException;
import java.io.FileReader;
public class Test {
public void methodA() throws FileNotFoundException {
FileReader file = new FileReader("a.txt");
}
}
try…catch…(finally…)Demo
如果我能够处理文件找不到的异常,那么使用try…catch…(finally…)形式
public void methodB(){
try {
FileReader file = new FileReader("a.txt");
} catch (FileNotFoundException e) {
System.out.println("这一步是对异常的处理区域");
e.printStackTrace();
} finally {
System.out.println("这一步是可选,无论是否出现异常都会执行的代码");
}
}
我抛出异常
在一些时候,抛出异常比返回一个消极的结果更加有用.例如因为条件不足导致无法得到最终结果,我们则可以抛出是哪些条件不足的异常,从而反馈消息,而不是直接返回处理失败的结果(这样开发人员或者用户得到的消息都会很莫名其妙,不知道自己哪一步出现了问题).
- 自定义异常(可选)
- 对于能够判断出会出现的异常,可选择直接抛出[如果想提供信息给接口调用者](也可以选择当场处理).
自定义异常
public class CannotBeZeroException extends Exception {
String msg;
public CannotBeZeroException(){}
public CannotBeZeroException(String msg){
super(msg);
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
抛出自定义异常Demo
/**
* 假设传入的参数不能为零
* @param value 判断值
* @return value不为0时的处理结果(这里假设处理都成功,即全部返回true)
*/
public boolean methodC(int value) throws CannotBeZeroException {
if (value == 0) throw new CannotBeZeroException("传入的参数不能为零");
return true;
}
- 调用**methodC(0)**则会得到下面的结果:
Exception in thread "main" com.company.CannotBeZeroException: 传入的参数不能为零
at com.company.Test.methodC(Test.java:29)
at com.company.Test.main(Test.java:34)
简单总结
- 有的时候抛出异常比直接返回失败结果更加有用
- 对异常要么处理,要么不处理(throw || throws)
- 对于特殊的异常,最好自定义异常类进行异常的描述