前言
由于被分母不能为0,所以代码到int y=n/m;会抛出异常,停止运行下去,但是如果是个庞大的代码,因为这种小错误而整个程序崩溃,会大大影响代码整体的健壮性,所以此时就需要我们得异常处理了
选中异常代码部分再使用ctrl+alt+t再选中try catch即可快捷异常处理
进行异常处理,就算出现异常也会接着执行如果不想看到报错。那么可以使用getmessage()方法接收错误然后打印出来
基本概念
Throwable实现了Serializable继承了Object,Throwable分为两类,Error和Exception,Error错误一旦发生无法使用异常处理解决,
运行异常
编译异常:
例题
try-catch处理机制
当f2方法出现异常,他就会通过throws抛出异常到调用它的f1,f1可以使用try-catch-final(没有final语法也是通过的)
处理异常,也可以抛出异常到调用它的main方法,main方法也可以选择使用try-catch-final处理异常,也可以抛出异常到JVM,如果到jvm就会到直接挂掉程序抛出错误
需要注意的是,如果没有写明是使用throws还是try-catch-final,他会磨人使用throws
try-catch异常处理
实例一
示例2
示例3
示例4
因为这段有两段异常,谁在前就报出谁的异常并且停止后面代码运行,所以此时打印出null异常信息就结束,不会到达下面的算数异常,如果,前面指针无异常那么就会到达算数异常,如果两个都异常并且想要他把异常信息都能打印出来那么就需要分开都使用catch接收一下如图
此时此刻可以都catch到异常,另外值得注意的是,父类Exception必须在其子类NUllPointerException,ArithmeticException后面,否则报错如图:
示例5:
这个发现异常,没有catch所以不会执行最后那句,执行完final就崩了
例题:
他先来到if(names[1].equals(“tom”),由于Sting数组并无赋值,随意每位元素都是null的,所以在此会报出NUllpointerException错误,然后直接来到catchNUllPointException那执行return 3,但是值得注意的是,final里的代码是必须执行的所以,必须在return 3时进入了final中运行里面的代码,最终返回了return4
该例题也是返回四,前面都是一个道理到NullPointerException,到return那不会立即返回,但是会执行++i的动作再进入final中的代码执行return++i
例题3
他到return++i;时,不会立即return出去,而是将i的值放到一个临时变量中存起来再去执行final中的代码,执行完之后再回到return那,拿上存在临时变量中的值返回回去,所以还是3
throws异常处理
示例2:
throws后除了就写该错误的异常FileNotFoundException,也可以写该错误类型的父类,Exception,也可以抛出多个异常,如图所示
示例3:如图,父类抛出的RuntimeException也是其类的子类抛出的NUllPointerException的子类,
子类抛出的要么是父类抛出的子类要么同一个
注意:
当一个方法调用了一个需要异常处理的方法且还不是运行异常,那么该方法就需要给调用的方法给出一种异常处理的方案,要么使用try-catch-final,要么使用throws。详情原因可以看到throws处理机制
如果是调用的是抛出运行异常的方法就无需在该方法中也要给一种处理方法,因为会默认处理
自定义异常
步骤:
新建一个类继承运行异常/编译异常,最后继承运行异常,因为运行异常会自己处理异常很方便
然后创建构造器,按要求自己选择
zai再然后就是去使用了,我们新建一个我们刚创建得自定义异常类,然后传入报错后需要前提的东西,然后再throw抛出就可以实现自定义异常操作了,其实从构造器不难看出。就是去调运父类的异常处理方式罢了
例题
先输出进入方法a然后他又抛出异常,但因为有final的原因没所以我们需要先执行final的代码再到外部去,那么这时就会被main中调用该方法时的异常处理中的catch接收并执行打印,后面同理可得
package com.abnormal.test02;
/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
编写应用程序EcmDef.java,接收命令行的两个参数(整数),计算两数相除。
计算两个数相除,要求使用方法cal(int n1,int n2)
对数据格式不正确(NumberformatException)、缺少命令行参数
(ArraylndexOutOfBoundsException)、除0进行异常处理(ArithmeticException)。
*/public class calculate {
public static void main(String[] args) {
//我们是直接输入数给main方法的形参数组String args[]
//所以至此,可以判断一下输入的数是否是两个,超过就用throw抛出错误
try {
if (args.length!=2)
{
throw new ArrayIndexOutOfBoundsException("参数个数不对");
}
//由于我们得args数组为字符串数组,所以存放的类型也是字符型的,所以需要将他们类型转换一下
int a=Integer.parseInt(args[0]);
int b=Integer.parseInt(args[1]);
int red=caculate_(a,b);//调用方法
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}catch (NumberFormatException e){
System.out.println("格式不对");
}catch (ArithmeticException e){
System.out.println("出现除0的情况");
}
}
static int caculate_(int a,int b)
{
return a/b;
}
}
例题;
因为o向下转型为字符串了当然无法强转成Integer
因为,final必须执行所以输出了B,然后因为调用的方法他抛出了异常,。所以后面的那句代码不再执行,直接来到打印C的代码,输出C然后又因为这段代码已经通过try-catch异常处理了。所以程序会继续执行,最后输出D