文章目录
I know, i know
地球另一端有你陪我
异常机制
Java程序出现的错误,程序出现了不正常的情况
1、所有异常有一个公共的父类
Throwable
2、往下可以分为两大类
Error(错误)
Exception(异常)
3、其中,Exception(异常)可以继续划分为两大类
RuntimeException(运行时异常)
除运行时异常之外的异常类(编译异常 / 非运行时异常)
异常处理机制
如果程序出现了问题,我们没有做任何处理,最终JVM会给出一个默认的处理
把异常的名称,相关的原因,以及出现问题的相关信息,包括位置输出在控制台
同时程序会结束,后面的代码不会运行
一、 Error (错误)
指程序无法处理的错误,大多数与执行者的代码无关
如内存溢出、类定义错误等,一般不处理
二、 Exception(异常)
指程序可以处理的错误,下分为运行时异常和编译时异常
常用方法
1、String getMessage()
获取异常信息,返回字符串
2、String toString()
获取异常类名和异常信息,返回字符串
3、void printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void
1、 RuntimeException(运行时异常)
指程序世纪运行中会出现的问题,一般是由于代码逻辑出现错误
如下标越界异常、空指针异常等
若使用 try — cahth 捕获或 throws 抛出,也可以不处理
在代码编译过程中不会被发现
2、 其他异常类(编译异常)
指在代码编译过程中就会被发现的问题
如部分类型转换错误
这些错误必须要进行处理,否则代码无法编译通过
三、 异常处理
在 Java 应用程序中,异常处理机制为:捕捉异常、抛出异常
1、 try — catch — finally(捕获异常)
代码格式
try {
可能出错的代码
} catch (可能出现异常类1 变量名) {
针对问题处理,如:
e.printStackTrace();
} catch (可能出现异常类2 变量名) {
针对问题处理,如:
e.printStackTrace();
} ......
finally{
善后工作,释放资源、关闭流等
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date parse = sdf.parse(s);
System.out.println(parse);
// 其后的代码均不会被执行
System.out.println("韭菜盒子");
} catch (ParseException e) {
e.printStackTrace();
} finally {
System.out.println("月光德彪西");
}
System.out.println("fgh");
/*
月光德彪西
java.text.ParseException: Unparseable date: "2021-10-18"
fgh
at java.text.DateFormat.parse(DateFormat.java:366)
at javase.day20.Exception1.main(Exception1.java:23)
*/
1、try 中语句尽可能少
2、catch 可以一次导入多个,但一定要有处理语句
3、能明确异常的类型的时候尽量明确,不要用父类大的作处理
4、平级关系,多个 catch 异常没有前后顺序关系,若有父类,必须在子类后
5、若 try 中代码出错,将会在那一代码后跳出至 catch
6、绝大部分情况下, finally 中代码一定会被执行
JDK 1.7中,新特性处理多个异常
代码格式
JDK7的新特性及注意事项
新特性处理多个异常
try{
可能会出现问题的代码;
} catch (异常类名1|异常类名2|... 变量名){
异常处理语句;
}
1、异常类必须平级关系
2、格式原因,处理代码方式唯一
2、 throws(声明抛出异常)
针对某些无法处理的异常,一般使用 throws 抛出
格式:
修饰词 方法名() throws 异常类 {
}
public static void main(String[] args) {
// 此处调用方法时依然需要捕获可能的异常
try {
fun();
} catch (ParseException e) {
e.printStackTrace();
}
}
public static void fun() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s1 = "2021-10-18 21:42:59";
String s2 = "2021-10-18";
sdf.parse(s2);
//sdf.parse(s2);
System.out.println("fgh");
/*
java.text.ParseException: Unparseable date: "2021-10-18"
at java.text.DateFormat.parse(DateFormat.java:366)
at javase.day20.Exception2.fun(Exception2.java:23)
at javase.day20.Exception2.main(Exception2.java:11)
*/
1、编译时期异常抛出,方法内可以不做处理,但是调用该方法时必须做处理
2、一旦调用出错,方法内后面的代码程序不会执行
3、推荐抛出的是详细的异常类型,可以抛出大的异常类型,但是处理的时候要对应上
4、做开发的时候,尽量不要在main方法上抛出,否则无法捕获异常
3、 throw(抛出异常)
在功能方法内部出现某种情况,程序不能继续运行
需要进行跳转时,就用 throw 主动把异常对象抛出
格式:
throw new 异常类类型
public static void main(String[] args) {
fun();
}
public static void fun() {
int a = 10;
int b = 0;
System.out.println(a/b);
throw new ArithmeticException();
}
/*
Exception in thread "main" java.lang.ArithmeticException: / by zero
at javase.day20.Exception3.fun(Exception3.java:19)
at javase.day20.Exception3.main(Exception3.java:10)
*/
四、 throw & throws
throws:
用在方法声明的后面,跟的是异常的类名
可以跟多个异常类名,用逗号隔开
类似一种声明,表示出现异常的可能性
为了程序的正常运行,我们选择抛出给调用者处理
throw:
用在方法体内,跟着的是异常的对象
只能抛出一个异常对象
类似一种行为,直接抛出这种异常
交由调用者捕获和处理
五、 final & finally & finalize
final:
可以修饰类,成员变量,成员方法
修饰类:类不能被继承
修饰成员变量:变量就是常量
修饰成员方法:方法不能被重写
finally:
是处理异常的一部分,一般情况下用于释放资源的作用,一般来说都会执行
特殊情况下:在执行finally之前JVM就停了(System.exit(0))
finalize:
是Object类中的一个方法,用于手动垃圾回收,但是不一定会立即回收
总结
Throwable
┕ Eoore
┕ Exception
┕ RuntimeException(运行时错误)
┕ 其他类错误(编译错误)
throw & throws
final & finally & finalize
上翻