异常处理
1. 异常是什么
JVM 针对于代码运行过程中,出现的错误,异常信息。打包之后抛出到方法外部或者自行处理。在异常信息中,需要给予开发者足够的信息提示,包括异常和错误的前因后果。
Java中异常基类
Throwable 类 Java中所有异常和错误的基类,规定了基础方法,和必要的构造方法形式。
Throwable 有两个子类
Error 错误
Exception 异常
2. Throwable 核心方法
构造方法相关:
Throwable();
创建 Throwable 对象,Throwable 对象中错误/异常信息为 null
Throwable(String message);
创建 Throwable 对象,Throwable 对象中错误/异常信息为 message
成员方法相关:
String toString();
获取错误/异常的简要信息描述,包括出现错误/异常类型信息。
例如:
java.lang.ArrayIndexOutOfBoundsException:10
String getMessage();
仅获取当前错误/异常中存储的异常信息
void printStackTrace();
在控制台展示错误的前因后果,红色字体!!!
package com.qfedu.a_throwable;
/*
* Throwable 类
* 代码中出现错误/异常 JVM会自动选择创建对应类型的错误/异常
*/
public class Demo1 {
public static void main(String[] args) {
Throwable throwable = new Throwable("有啥别有病,没啥别没钱");
// System.out.println("getMessage : " + throwable.getMessage());
// System.out.println("toString : " + throwable.toString());
// throwable.printStackTrace();
test();
}
private static void test() {
Throwable throwable = new Throwable("异常演示");
throwable.printStackTrace();
}
}
3. 异常和错误的区别
异常:
Exception
车小剐小蹭 异常,可以维修!!!
车有大故障!!!街边的修理厂,不行,修不了,你可以考虑去4S
捕获
抛出
错误:
Error
"720" 你的车在地下车库三层,你的车距离水面以上有将近15米,泡了一个半月。
车直接报废!!!
最大区别就是错误和异常类型结尾单词不同!!!
4. 异常处理两种形式
4.1 捕获异常
格式:
try {
// 有可能出现异常的代码 JVM会自动创建对应异常类型,同时提供必要的异常信息
} catch(异常类型对象1) {
// 针对当前异常类型的处理方式
} catch(异常类型对象2) {
// 针对当前异常类型的处理方式
}
try {
} catch() {
} finally {
}
package com.qfedu.a_throwable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/*
* 文件操作演示异常问题
*
* FileNotFoundException 文件未找到!!!
*/
public class Demo2 {
public static void main(String[] args) {
try {
/*
* Unhandled exception type FileNotFoundException
* 未处理异常,异常类型为 FileNotFoundException 文件未找到异常
*
* Ctrl + 1 快速修复
* surround with try/catch
*/
FileInputStream fis = new FileInputStream("G:/aaa/1.txt");
/*
* Unhandled exception type SQLException
* 未处理异常,异常类型为 SQLException 数据库异常
*/
Connection connection = DriverManager.getConnection(null);
} catch (FileNotFoundException e) {
// 针对于文件未找到异常情况处理
System.out.println("日志记录:");
e.printStackTrace();
} catch (SQLException e) {
// 针对 SQL 数据库异常处理
System.out.println("日志记录:");
e.printStackTrace();
}
System.out.println("代码继续执行.....");
}
}
1. 在 try 大括号是有可能出现异常的代码
2. 代码如果有异常存在,JVM会在运行阶段创建对应异常对象,保留必要信息,可以提供给 catch 块捕获操作
3. 在 catch 小括号中是针对于异常的处理类型
4. JDK 1.8 中允许出现一个 catch 块同时捕获多个异常,使用 位或(二进制运算符) |
案例
catch (FileNotFoundException | SQLException e)
5. 在 catch 块是针对当前异常的处理方式,后期可以进行日志记录,消息记录,转发给其他程序,提供给用户一定的提示页面
6. 如果代码执行 try catch 获取异常之后,JVM 认为当前程序中没有异常,代码可以从 catch 块之后继续执行。
4.2 抛出异常
关键字
throw 在方法内部指定条件下,抛出异常对象!!!
throws 在方法声明位置,告知调用者当前方法有哪些异常抛出!!!
package com.qfedu.a_throwable;
import java.io.FileNotFoundException;
import java.sql.SQLException;
public class Demo4 {
public static void main(String[] args) throws FileNotFoundException, SQLException {
// 调用带有异常抛出的方法,第一种方式,捕获异常
try {
test("111", "222");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 调用带有异常抛出的方法,第二种方式,捕获异常 按照 JDK 1.8 规则可以用一个 catch 利用【位或】处理多个异常
try {
test("111", "222");
} catch (FileNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 调用带有异常抛出的方法,第三种方式 继续抛出异常
test("111", "222");
}
/*
* @throws 文档注释中用于提示用户当前方法有哪些异常抛出
*/
/**
* 测试方法
*
* @param fileName 文件名称
* @throws FileNotFoundException 文件未找到异常
* @throws SQLException SQL异常
*/
public static void test(String fileName, String sql) throws FileNotFoundException, SQLException {
// 如果文件名不合法,抛出 FileNotFoundException 文件未找到异常!
if (null == fileName) {
/*
* 抛出异常,当前文件未找到
* throw 方法内部抛出异常关键字
* new FileNotFoundException("给予方法文件名称不合法!");
* 创建了一个 FileNotFoundException 异常对象,同时给予必要的异常信息 message ==> "给予方法文件名称不合法!"
*
* Unhandled exception type FileNotFoundException
* 未处理异常,异常类型 FileNotFoundException
*/
throw new FileNotFoundException("给予方法文件名称不合法!");
}
if (null == sql) {
throw new SQLException("SQL异常");
}
}
}
4.3 抛出和捕获的选择
5. 编译时异常和运行时异常
package com.qfedu.a_throwable;
import java.sql.SQLException;
public class Demo5 {
public static void main(String[] args) {
}
/*
* JVM虚拟机针对于异常类型进行了分类
* 1. 编译时异常
* 在代码编译阶段对异常进行抛出或者捕获处理,解决方法中出现的异常问题
* 2. 运行时异常
* JVM针对于运行时异常有一定的处置方式,同时这一类异常较为普遍
* 例如:
* ArrayIndexOutOfBoundsException 数组下标越界异常
* NullPointerException 空指针异常
* StringIndexOutOfBoundsException 字符串下标越级异常
*/
public static void test() throws SQLException {
// throw new ArrayIndexOutOfBoundsException("数组下标越级异常");
throw new SQLException("SQL语句异常");
}
}