Java异常机制
什么是异常
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。
不一定会导致程序无法继续运行,根据程序员的处理来决定是否停止运行或者提示又或者其他方式
- 检查性异常
- 运行时异常
有的可以避免,有的无法避免
分为几大类
- 用户输入了非法数据
- 要打开的文件不存在
- 网络通信时中断
- JVM内存溢出
但我们自己定义的异常则不属于这个范畴,比如,如果输入的年龄大于了120,我们可能会定义一个自定义异常,来抓取输入可能出现的异常,来提醒用户年龄的输入
而与异常不同的是,是错误
错误:脱离了程序员控制的问题,在代码中通常被忽略
比如,栈溢出,这个是程序员即使进行调试优化也无法遇见的bug
异常类
Exception类是所有异常类的父类
而需要抛出的问题,包括了异常和错误
所以大体层次为
而Java语言定义了很多供我们使用的异常类在java.lang
标准包下
具体是何种类,以自己想要的异常处理为筛选条件,通过Java官方文档进行查看
如何进行捕获异常
try catch
具体语法看代码以及相关注释 – 以ArithmeticException
为例子
ArithmeticException
:当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
public void Cal() //throws 异常类 -- 也可以在这里写,如果没有捕获到异常,会将异常检查抛出到他的调用者身上
{
if(cal == '+'){
System.out.println("运算结果为"+(a+b));
}else if(cal == '-'){
System.out.println("运算结果为"+(a-b));
}else if(cal == '/'){
//若为除法的同时,第二个运算数是0,抛出异常
if(b == 0){ //该条件即为一个整数"除以零"时,抛出此类的一个实例
throw new ArithmeticException();
//在函数定义中,在判断出现异常条件中,抛出一个新构造的异常类
}else {
System.out.println("运算结果为" + (a / b));
}
}else if(cal == '*'){
System.out.println("运算结果为"+(a*b));
}else{
;
}
}
//进行调用
try{
cal.Cal(); //代码块中为要被检查是否有异常的代码
}catch(ArithmeticException e){
System.out.println("在使用除法运算时,第二份运算数不可为0");
//抓取到异常后应该进行的相应操作--由程序员自己设计
}
也可以进行多重捕获
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
当然,如果前面的
catch
已经抓取到了异常,相应代码块中的代码就会被执行,而后面的catch就会自动跳过;否则,则会遍历所有的catch
也可以进行是否抓取到都进行一些操作 – finally
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
[!IMPORTANT]
catch
不能独立于try
存在finally
可加可不加try
代码后必须要有catch
后者finally
其中的一个try
,catch
,finally
之间不能有任何代码
声明自定义异常并进行使用
要求
- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
例子
public static void setCal(char cal)throws InvalidOperatorException {
//若不属于规定的运算符,抛出异常
if(cal != '+' && cal != '-' && cal != '*' && cal != '/'){
throw new InvalidOperatorException(cal);
}else{
this.cal = cal;
}
}
//自定义异常
class InvalidOperatorException extends Exception{
String msg;
public InvalidOperatorException(char cal) {
this.msg = "不可以使用这个运算符"+cal+"进行运算";
}
@Override
public String toString() {
return "MyExeption{" +
"msg='" + msg + '\'' +
'}';
}
}
//检查是否有异常,有就抓取,并输出异常信息
try{
cal.setCal(cal1);
}catch(InvalidOperatorException e){
System.out.println(e.toString());
}
通用异常
- **JVM(Java虚拟机) 异常:**由 JVM 抛出的异常或错误。例如:
NullPointerException类
,ArrayIndexOutOfBoundsException类
,ClassCastException类
。 - **程序级异常:**由程序或者API程序抛出的异常。例如
IllegalArgumentException类
,IllegalStateException类
。