什么是异常
1.接下来我们用一段代码来引入什么叫做异常
public class Expectation01 {
public static void main(String[] args) {
int num1 = 10;
int num2 = 0;
int rut = num1/num2;
System.out.println(rut);
System.out.println("我能编译出来");
}
}
这样一段代码就可以将我们引入什么叫做异常,咱们看,代码出现异常ArithmeticException,然后后面的代码就没有编译出来,这就是异常
在以后的实际开发中,开发一个软件可能会有成百上千的文件,但是因为这种微不足道的异常就让系统奔溃,是不是非常不现实,所以就出现了Java设计者的想法,异常捕获机制,try-catch
我们来演示一下,还是那段代码,
也就是选中代码块,然后按住快捷键Ctrl-alt-T 然后选中6try--catch
2.他的好处
这样做有什么好处呢,就是保证了代码的健壮性,然后他不不会被轻易的异常所系统奔溃
3.异常和错误的区别
错误,也就是我们常说的error,也就是我们初学时经常发生的,比如说语法错误,逻辑错误等等,这些都被称之为error而不是异常。就比如说栈溢出,还有内存不足,就像人得了癌症晚期,没有办法用异常捕获机制
异常,它分为运行异常与编译异常,既然都说了他和错误不同,也就是它是因编程错误,与偶然因素导致的一般性问题,空指针,
就比如上面那个问题,他就是运行异常
异常体系图(重点)
在上面就是比较常见的异常,分为error和Expectation,error里面有栈溢出,内存不足,上面都有,然后再expection里面分为运行异常(RuntimeExpection),与编译异常。
然后来进行一个小节:
1.它分为两种异常运行异常与编译异常
2.在运行异常,这种比较常见我们可以不做处理,因为假如我们在写程序时,有100行代码,如果每个运行异常都要处理的化,可能会有五六十行代码都是try--catch;
3.在编译异常中,这是编译器出现的异常我们必须处理;
五大异常
1.空指针异常
这比较简单,就看上面的例子,在上面有两个字符串,一个name一个age一个是null另一个有内容,然后打印的时候就出现空指针异常比较简单;
2.数学运算异常
上面也讲过了就是那个分母为0,时的异常
3.数组下标越界异常
在这段程序中,我们设计了一个数组,然后在下面的遍历中,我们使i=arr.length;就出现了数组下标越界异常
4.类型转换异常
因类型转换而抛出异常
5.数字格式不正确异常
看这样的程序他是正确的,而如果把他变一下,把字符串类型中的1234变为小王,小红,你该怎么办,他就会抛出异常
就是这个样子
异常处理机制运行图
咱知道的异常处理记住有两个一个是try-catch-finally,另一个是throw
try-catch-finally
咱先来解释一下try-catch-finally;
咱们前面说了如果你觉得这个代码块可能有问题,
咱就用try包起来,将这个异常,封装到Expection e中传递给catch
然后再catch{
如果有异常,由程序员自己决定,想干什么干什么}
finally{不管有没有异常,都会经过finally
}
这就是try-catch-finally得机制图
throw
然后是throw,这个就比较有意思,我先说明最后是thorw给jvm然后给你举个例子
当你家丢了一头牛时,你是不是找村长,村长说办不了啊,然后村长上报给县里,然后县里说我也不行啊,然后给省里,省里大手一挥给了你几万块钱这个是过去了,throw得机制就是这个样子
try-catch-finally的注意事项
1.就是他的使用方法
在前面讲过我们就不在过多叙述了
2.就是如果发生异常,异常后面的代码块将不会执行,直接进入到catch中进行捕获,用代码来解释一下
这是没有异常的情况
下面是有异常的情况
他就不执行后面我最帅的语句了
3.如果没有异常发生就不会进入到catch中了
这个很简单,不用过多介绍了
4.若有多个异常,我们可以用多个catch来捕获异常,但是要子类异常在前父类异常在后
像这样有多个异常,如果我们用一个catch来捕获异常,那样当捕获了第一个异常之后,下面的语句就不会执行了,也就是下一个异常就不会捕获了,所以我们要用多个catch来进行捕获,并且子类在前,父类在后
这样就是上面的解释,
如果你把父类放在前面,咱来试一下
就会报错
5.还可以直接用try-finally,就是相当于没有捕获异常,直接finally,程序会直接崩掉
练习题
一开始i被初始化为1;然后进入到try中i++,i变为2,然后下面很明显是空指针异常,然后捕获到catch中,有个return i++,i变为3;这里需要注意的是,要看finally中有没有return,虽然catch有return但是一但finally有return,要在return中执行返回,这里没有然后进入到finally i变为4
你是不是要说输出i= 4;这你就错了,别忘了catch还有个return,他在那里创建了个临时变量temp = 3,所以返回的是i=4,3
练习题 设计一个程序,如果输入的不是整数,就让他一直输入
程序如下
public class test {
public static void main(String[] args) {
int num = 0;
String str = "";
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入一个整数:");
str = sc.next();
try {
num = Integer.parseInt(str);
break;
} catch (NumberFormatException e) {
System.out.println("您输入的不是整数:");
}
}
}
一个比较好理解的例子
throws
在上面我们已经介绍过了,throws的工作原理,也举了他的比较好懂得例子
然后我们就是来介绍一下他的使用方法
thorws后面得异常类型可以是他方法中的异常类型也可以是他的父类
可以看到这两个都可以
throws异常处理
自定义异常
见名知义,就自己定义一个异常类,也就是当出现得异常,expction子类中没有时,可以自己创建一个异常类
他的步骤就是:
1.首先我们先来定义一个类,类名我们自己订就可以,然后这个类,我们要继承Exception或RuntimeExpectation
2.当你定义得是编译异常就是继承Exception
3.要是运行异常就是继承RuntimeExpectation
thorw与throws的区别
thorws他是异常处理的一种方式,与try-catch一样,位置他就是在方法声明处后面加异常类型
thorw他是手动生成异常对象的关键字,他在方法体中,后面加异常对象。