目录
1.什么是异常
编程通过, 程序运行的时候, 由于一些外部环境变化,或者程序逻辑问题,造成的运行时错误。
关键字: 编译通过, 运行时可能出现的错误,。
语法错误: 编译不通过,编译错误 最低级的错误。
异常类: 本质还是一个类, 给这一类型的类取一个统一名称。
2.异常的体系结构
Throwable是java语言中所有错误和异常的超类(万物即可抛)。
Error为错误,是程序无法处理的。
Exception是程序可以处理的异常。
3.优雅的异常处理
IOT --> 智慧型城市
java之父: 詹姆斯·高斯林 优雅
Think in java(java 编程思想): 埃克尔 (Bruce Eckel) 繁琐
spring 之父: 罗宾·约翰逊
异常处理:
1.try -catch - finally 捕获异常并处理
try{ //试一下
可能出现异常的代码
}catch(异常类型 变量名){ //捕获异常
//对捕获到这种异常的处理代码
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//两个数相除
System.out.println("请输入被除数:");
int num1 = input.nextInt();
System.out.println("请输入除数:");
int num2 = input.nextInt();
System.out.println(num1+"/"+num2+"="+(num1/num2));
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
//两个数相除
System.out.println("请输入被除数:");
int num1 = input.nextInt();
System.out.println("请输入除数:");
int num2 = input.nextInt();
System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
System.out.println("程序结束了....");
}catch(ArithmeticException ex){ //捕获ArithmeticException异常
System.out.println(" 除数不能为0 ");
//调用异常相关方法
}
}
代码运行情况:
- 第一种情况,当程序正常执行,try中的代码执行完,catch中的代码不会执行,catch后面的代码会执行
- 第二种情况,当程序发生异常,并且异常的类型与catch小括号的异常一样,try中发生异常处之后的代码不会执行,则执行catch中的代码,catch后的代码也会执行.
- 第三种情况,当程序发生异常, 并且异常的类型与catch小括号的异常不一样, try中发生异常处之后的代码不会执行,也不执行catch中的代码,catch后的代码也不执行.程序会在发生异常区终止程序.
try大括号中的代码: 是 业务代码
catch大括号中的代码: 处理异常的代码
try后面可以接多个catch, 进行多种异常的捕获
1) 多个catch, 如果这些异常类型没有父子关系, 顺便任意
2) 多个catch, 如果这些异常类型有父子关系, 先子后父
3) 在jdk1.7之前每个catch代码段只声明一种其能处理的特定类型的异常,并提供处理的方法。 Jdk1.7之后,一个catch代码可以可以声明多个能处理的特定异常的类型,多个类型之间用”|”隔开
前提要求: 这些异常没有父子关系, try中可以产生异常
finally 代码块: 该代码块,不管是否产生异常, 都会执行的
try{
}catch(异常类型 e){
}catch(异常类型 e){
}
...
}catch(异常类型 e){
}finally{
}
1) try-catch-finally 这个三个一定全部存在?
try-catch
try-finally
但是try,catch,finally不能单独存在, catch,finally必须跟着try
2) return 写法:
a. try 中写, try-catch-finally 之外写 return;
b. try 中写, 每个catch中写 return
c. finaly 写; 只写一个return, 不推荐
d. 在try-catch-finally 之外写, 只写一个
方法有return 又有finally, finally中的代码是在return之前执行.
2. throw / throws 抛出异常
throw 异常对象; 具体抛出一个异常对象, 写在方法体内部
throw作用: 1) 返回异常结果 2) 结束方法
throws 异常类1,异常类2,... 写在方法签名上, 声明该方法可能会抛出什么类型的异常
异常常用的方法:
throws 在方法签名上, 表示这个方法可能会抛出什么类型的异常
throw 抛出的异常类型是RuntimeException类型或者子类, 这个方法可以使用throws 声明,也可以省略
throw 抛出的异常类型是编译异常, 这个方法一定使用throws 声明
编译时异常, 代码必须处理的异常,不处理,编译都不通过,
RuntimeException异常, 可以处理,也可以不处理, 编译不会出错
4.自定义异常
在实际开发中, 根据项目的业务需求, 把某些情况定义为异常:
删除学生: 通过学号删除, 学号不存在作为一种异常来看, 但是jdk没有这个类型的异常
jdk允许我们程序员根据业务需求, 自定义一些异常类:
步骤:
1) 创建一个类(异常类取名: XxxException)
2) 让这个类继承Exception类(推荐),或者Exception子类
3) 根据Exception的构造方法生成自定义异常类的构造方法
代码实例:
public class MyException extends Exception {
public MyException() {
super();
}
public MyException(String msg) {
super(msg);
}
public MyException(Throwable cause) {
super(cause);
}
public MyException(String msg, Throwable cause) {
super(msg, cause);
}
}
使用自定义异常类
public String[] xxArray(int length) throws MyException {
if (length < 0) {
throw new MyException("数组长度小于0,不合法");
}
return new String[length];
}