异常
异常快速入门
先来看一段代码
package com.hansp.Exception;
public class Demo01 {
public static void main(String[] args) {
int num1=10;
int num2=0;
//1.分母为0
//2.当程序检测到分母为0时,程序就会抛出异常ArithmeticException
//3.当抛出异常后,程序会崩溃,下面的代码就不会再运行
//4.这样的代码,一个小错误,就会导致整个程序不能运行,以后设计软件的时候不太使用,健壮性太差
//5.java提供了一个异常处理机制来解决该问题
//可以用try-catch来处理
//6.可以选中你认为可能出错的代码区域,用ctrl+alt+t跳出界面,然后选择6
//如果进行异常处理,那么即使出现了异常,程序也可以继续执行
try {
int res=num1/num2;
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());//可以输出异常信息
}
System.out.println("程序继续运行....");
}
}
运行结果
一些理解
在程序执行过程中发生的不正常行为称为异常(开发过程的语法和逻辑错误不算)
包括那种在idea上就标红的
和运行时检测出来的
而且异常的出现会导致程序停止运行,导致代码的健壮性太差
不可能只因为一个小错误,终止整个程序
所以出现了异常处理机制
来保证小错误不会影响整个程序的运行
异常基本介绍
在程序执行过程中发生的不正常行为称为异常(开发过程的语法和逻辑错误不算)
异常事件分为两大种
第一种是无法用异常处理机制的
第二种介绍异常处理机制针对的对象了
异常体系图
这里的Exception只列举了几个常见的异常,还有很多异常,大家可以在idea上查看
异常概念小结
编译时异常:一般来说,你在写代码出现的红标就是编译时异常
有红色下划线
如图
这种异常需要在编译器上马上处理,不然代码不能跑,!!!!!,抛出或者处理,需要自己写代码操作
运行时异常:像那种运行时才能检查处理的异常,比如分母为0什么的
下面会介绍五大运行时异常
运行异常都是默认抛出!!!
五大运行时异常
空指针异常
1.继承关系
2.举例
3.解释
当程序试图调用对象的地方是null时候,会抛出空指针异常
上面的程序name.length()明显需要name指向一个String对象
但是它却是空,没有长度的,所以会报错
数字运算异常
1.继承关系
2.例子
上面的/0的例子解释数字运算异常
3.解释
当出现异常的运算条件时,抛出此异常,例如一个整数除以0
数组下标越界异常
1.继承异常
2.例子
3.解释
arr数组三个值arr[0],arr[1],arr[2];
<=arr.lengrh();就是小于等于3
但是并没有arr[3]的对应对象,此时数组下标访问越界,所以抛出数组越界异常
类型转换异常
1.继承关系
2.例子
3.把一个B类的实例b转为C类的实例,显然不对所以会报类转换异常
数字格式不正确异常
1.继承异常
2.例子
3.解释
当应用程序尝试试图将字符串转换为一种数值类型,但该字符串不能转换为适当格式时,抛出该异常(字符串转型那个pase对象形式)
使用该异常可以确保输入是满足条件数字
编译异常
异常处理机制
try-catch-finally
程序员捕捉发生的异常,自行处理
用法示意图
细节及使用方法
然后在try中遇到异常跳入catch中,然后有finally跳入finally
之后的话程序是不会停止运行的,会调到try-catch-fianlly外面的紧接的代码继续运行,如上图
4.如果try中有多个异常(异常类型相同),会先捕获前面的异常,然后处理,后面那个异常是不执行的,都在try里
如果想对不同异常分开捕获进行对应的处理,要对异常的类型具体区分,进行多个catch,来捕获你想捕获的异常
父类异常要放在子类的异常后面,要不然父类就把子类的异常处理了,你写子类的异常有什么用呢?
比如这样就是不对的
这个获取异常是运行时检测到异常,直接到对应的catch然后到finally,不会是有catch的异常全部捕获
只会运行首先捕获的异常对应的catch中的代码和finally中的
5.
throws
将发生的异常抛出,交给调用者(方法)处理,最顶级处理者是JVM
程序员没有显示是处理异常默认是throws
处理示意图
JVM处理异常
就是输出异常信息然后终止程序的运行
public static void main(String args[]) thorows Exception(抛出异常是默认的,所以我们有异常时,会给到JVM,JVM就输出异常信息,然后停止程序运行)
细节及使用方法
演示类是编译异常,运行异常默认就是抛出
抛出异常前
抛出异常后(会让调用者处理)
throws可以接你想抛出的异常,如果你想有异常就抛出(不用判断异常的类型)可以自己写
throws Exception
也可以抛出多种异常throws 异常种类1,异常种类2,异常种类3;
细节
1和2上面有案例
3
4为1和2的总结啊
5.编译异常的抛出也需要处理(在调用方法里处理)
编译异常f1()需要处理调用的f3()抛出的异常
可以抛出或者try-catch
运行异常抛出,是默认抛出的,f4()调用的抛出异常的f5()然后,f4()默认抛出f5()抛出的异常如果一直不处理最后会由JVM处理
自定义异常
当程序出现了"错误",但是该错误并没有在Throwable里面子类中描述,可以自己设计异常类,用于描述该错误信息
步骤
3需要注意
案例
throw和throws
throws
带一个异常类型
throw
带一个具体异常对象
应用
package com.hansp.Exception;
public class EcmDef {
static public int cal(int n1, int n2){
return n1/n2;
}
public static void main(String[] args) {
try {
if (args.length!=2){
throw new ArrayIndexOutOfBoundsException("参数个数必须为两个");
}
int n1=Integer.parseInt(args[0]);
int n2=Integer.parseInt(args[1]);
double res=cal(n1,n2);
System.out.println("计算结果是"+res);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
}
catch (NumberFormatException e){
System.out.println("参数格式不正确,需要重谢");
}
catch (ArithmeticException e){
System.out.println("出现了除0的异常");
}System.out.println("牛牛牛");
}
}