部分内容总结灵感来自马士兵教育,部分来自百度。
概述
什么是异常?
异常是程序运行启动过程中发生的意外事件,它会中断正在运行的程序。
为什么会产生异常?异常有什么用?
例如生活中:
什么是异常处理?如下图所示
Java异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
异常类的层次
Java中所有的异常类都是 java.lang.Exception 类的子类。
而Exception 类又是Throwable 类的子类。Throwable有两个子类,分别是Exception与Error。
Exception有两个比较重要的子类:IOException 类和 RuntimeException 类
捕获异常try{}catch{}
没进行异常捕获之前,这段代码可能会发生的以下异常并且发生异常代码行后的代码见不会被执行
package com.javase;
public class TestString {
public static void main(String[] args) throws Exception {
int a = 100;
int b = 100 / 0;//可能会发生异常的代码行,这里没进行try{}catch{}异常捕获
System.out.println(b);
System.out.println("这是测试代码");//这行代码不会被执行
}
}
try{}catch{}finally{}异常处理后的代码
package com.javase;
public class TestString {
public static void main(String[] args) throws Exception {
try {
int a = 100;
int b = 100 / 0;//可能会发生异常的代码行,这里进行try{}catch{}异常捕获
System.out.println(b);
System.out.println("这是测试代码");
} catch (ArithmeticException e) {//还可以多重捕获异常,多个catch块,不过异常类级别最低的放在第一个catch块,级别最高的放在最后
System.out.println("发生异常,异常信息:"+e.getMessage());
}finally {
System.out.println("无论有没有发生异常这个代码代码块都会被执行,在Java中一般用来释放资源的");
}
}
}
声明异常Throws和抛出异常 Throw和自定义 异常GenderException("性别发生异常")
package com.javase;
import java.util.Scanner;
public class TestString {
static class GenderException extends Exception {//自定义异常类继承Exception 并重写Exception的构造方法,提示自定义异常语
public GenderException() {
System.out.println("性别出现异常");
}
public GenderException(String message) {
System.out.println("输出异常信息:"+message);
}
}
public static void toGender() throws GenderException {//throws 异常类【GenderException】 声明异常
System.out.println("请输入你的性别");
Scanner scanner = new Scanner(System.in);
String gender = scanner.next();
if (gender.equals("男")) {
System.out.println("你的性别为:" + gender);
} else {
throw new GenderException("性别输入错误,请重新的输入");//抛出异常【GenderException】
}
}
public static void main(String[] args) {
try {//这里调用方法,并对抛出的异常进行捕获
TestString.toGender();
} catch (GenderException e) {
e.printStackTrace();
}finally{
System.out.println("finally块");
}
}
}
finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码都会被执行。
在 finally 代码块中,用来释放资源关闭流。
try {//这里调用方法,并对抛出的异常进行捕获
TestString.toGender();
} catch (GenderException e) {
e.printStackTrace();
}finally{
System.out.println("finally块");//一般可用于关闭连接释放资源
}
-
catch多重异常,子异常类放在第一个catch块里,子到父,一级一级往下衍生,如果父异常放在第一个catch块会出现父异常类信息提示,规避子异常的异常提示,对于代码维护带来不便。
-
throws声明异常可以声明多个,用逗号隔开。一般建议声明一个范围比较大的父异常类。
-
try{}catch{}finally 三个代码块中单独声明的局部变量不可相互使用,作用域问题。
-
少在try...catch...finally块里使用return。
-
throw 抛出异常,一般抛出异常和自定义异常/声明异常三者同时使用。