异常
1.为什么要使用异常
在数组中找出用户指定下标位置对应元素,数组为 int 类型
public static int get(int[] arr,int index);
if (index < 0 || index >arr.length - 1){
//方法返回值为 int 类型,无论返回任何一个整数都有可能是正常数据
//问题 没有合理合适的方法告知用户当前操作存在问题,返回值数据无法明确标识
//如果使用 System.exit(0) 不合适
}
Java 中提供异常机制,将错误信息封装到一个异常对象中,将异常对象抛出方法之外,方法外都可以获取到对应的异常信息,将当前异常进行处理或者分析
注意代码中不是为了写异常,而且通过异常的方法提供更多的错误信息,异常信息,代码运行的非找正常状态信息给到程序反馈,方便更好的修改代码,调试代码
2. 异常类型结果和继承关系
Throwable
Java 中所有异常和错误的基类,规定了一些异常和错误的必要方法(信息获取,简要描述,控制器异常/错误原因展示)
---- | class EXception extends Throwable
Java中的异常 可以处置
----- | class Error extends Throwable
Java 中的错误 只能避免
Throwable 常用 API
构造方法:
Throwable();
无参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 null
Throwable(String message);
有参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 message
成员方法
String toString();
获取当前错误/异常的简要描述
String getMessage();
仅获取错误/异常信息
void printStackTrace();
展示错误/异常方法调用流程,栈区错误信息流程,可以看到异常的前因后果
package com.qf.edu;
public class Demo1 {
public static void main(String[] args) {
//无参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 null
Throwable throwable = new Throwable();
//有参数构造方法,和new 关键字联用,可以实例化 Throwable 对象,异常/错误信息为 message
Throwable t2 = new Throwable("单身狗异常");
System.out.println(throwable.toString());
t2.printStackTrace();
test();
}
public static void test() {
Throwable t1 = new Throwable("调用方法异常情况!");
t1.printStackTrace();
}
}
3. 异常和错误的区别
名称区别:
所有的异常结尾都是 Exception
所有的错误结尾都是 Error
Exception 可以处置
抛出 社区医院无法处理骨折问题,建议去大医院,大医院处置
捕获 伤口包扎社区医院直接处置
Error 无法处理
【注意】
Java代码出现了异常/错误,代码停止执行,需要后续处理。
4. 针对异常处理方式
目前异常处理针对当前的代码体验不佳,使用不明显
【重点】异常对象存储有异常相关信息,异常内容,异常出现的方法调用顺序,方法执行过程 ===>存储到日志
后期课程对于异常进行等级分类:
Info 信息 Warning 警告 Danger 危险
对于目前而言 Eclipse 当中处理异常都是 Ctrl + 1
4.1捕获处理
格式:
try {
有可能出现异常的代码,例如:数组下标操作,引用数据类型指向 null
} catch (异常类型,异常对象名,常用小写 e1) {
catch 小括号声明告知当前大括号处理的是哪一个异常类型
针对于当前处理的处理方式,目前而言无法采用日志方式进行存储,只能展示...
} catch (异常类型,异常对象名,常用小写 e2) {
catch 小括号声明告知当前大括号处理的是哪一个异常类型
}
package com.qf.edu;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/*
* try catch 异常捕获展示
*
* */
public class Demo3 {
public static void main(String[] args) {
/*
* 根据当前系统中的 D:/aaa/1.txt 路径对应的文件,创建对应文件的字节输入流对象
* Java 从文件中获取数据
* 改代码有隐患,例如文件不存在,路径不合法,没有D 盘,没有操作权限..
* 以上隐患对于 Java 代码而言就是通过异常方式来处理
*
* Unhandled exception type FileNotFoundException
* 尚未 处理FileNotFoundException 异常,尚未处理文件未找到异常
*
* Ctrl + 1 快速修复 选择 == > surround with try/catch 捕获处理
*
*
* 代码提示尚未处理的异常是语法错误,提供报错,使用捕获处理之后,代码不在报错
*
* 代码的异常出现之后,通过捕获操作,JVM 认为已经没有异常存在,代码可以继续运行
*
* 在 try 大括号中,如果出现了异常,从异常位置开始,之后的代码不在执行
* */
try {
FileInputStream fileInputStream = new FileInputStream("D:/aaa/1.txt");
System.out.println("------代码运行--------");
} catch (FileNotFoundException e) {
//针对于FilenotFoundException异常处理方式
//目前有且只只能控制台展示异常方法调用顺序、代码执行流程、错误信息..
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("....代码继续执行.....");
}
}
package com.qf.edu;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/*
*
* 多异常代码处理
*
*
* try - catch 结构允许并行多个 catch 块,分门别类处理不同的异常。
* */
public class Demo4 {
public static void main(String[] args) {
/*Unhandled exception type FileNotFoundException
* 文件未找到异常
* */
try {
FileInputStream fileInputStream = new FileInputStream("G:/aaa/测试.txt");
/*
*
* Unhandled exception type InterruptedException
* 中断异常
*
* */
Thread.sleep(1000);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("文件未找到异常");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("中断异常");
}
try {
FileInputStream fileInputStream = new FileInputStream("G:/aaa/测试.txt");
/*
*
* Unhandled exception type InterruptedException
* 中断异常
*
* */
Thread.sleep(1000);
} catch (FileNotFoundException | InterruptedException e) {
//允许两个异常并行!!同时处理,适用于将同级别,同类型异常统一处理
System.out.println("同级别异常:" + e.toString());
}
}
}
4.2抛出处理
关键字:
throw
方法中判断条件无法满足代码正常允许的情况,实例化异常对象,并且提供字符串信息作为异常信息,抛出异常对象,提示用户/代码当前代码存在问题。
例如:
数组下标越界,数据参数不符合,学生成绩不合法....
throws
【方法声明】位置告知方法调用这,当前方法有哪些异常存在。提示用户/代码,需要对异常进行处理,注意异常的出现情况
package com.qf.edu;
/*
* 抛出异常演示
*
* */
public class Demo5 {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 6, 9, 8, 74, 21, 22};
/*
* 调用一个带有异常抛出的方法
* 1.继续抛出
* 2.捕获处理
* */
//捕获处理
try {
test(arr, 1);
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println("异常情况:" + e.toString());
}
test(arr, 20);
}
/*
*
* 文档中多出了一个 @throws 需要对抛出异常进行结束,异常类型,异常情况,异常说明
* */
/**
* 展示指定数组下标内容
*
* @param arr int 类型数组
* @param index 指定下标参数
* @throws ArrayIndexOutOfBoundsException 给予方法数组下标越界异常
* */
public static void test(int[] arr, int index)
throws ArrayIndexOutOfBoundsException {
//数组下标越界
if (index < 0 || index > arr.length - 1) {
/*
* 根据 if 条件判断情况 ,得出当前异常为数组下标越界异常
*
* */
throw new ArrayIndexOutOfBoundsException("用户提供数组下标越界");
}
System.out.println(arr[index]);
}
}
package com.qf.edu;
/*
* 抛出异常特征语法
* */
public class Demo6 {
public static void main(String[] args) {
}
/**
*
* 多个异常输入,在throws 之后使用逗号隔开
*
* @param arr
* @param index
* @throws NellPointerException
* @throws ArrayIndexOutfboundsException
* */
public static void test(int[] arr, int index)
throws NullPointerException, ArrayIndexOutOfBoundsException {
//当前数组为 null 数组不存在,并且 null 不能操作
/*
* if (null == arr || index < 0 || index > arr.length - 1) {
* System.out.println("用户参数不合法");
* return;
* }
*/
if (null == arr) {
/*
* NullPointerException 空指针异常
*
* throw 抛出异常操作,之后的代码都是 Unreachable code 无法触及的代码,无法执行代码
* 方法从异常抛出位置开始终止运行
*
*
*
* */
//NullPointerException 空指针异常
throw new NullPointerException("数组不能为 null");
}
if (index < 0 || index > arr.length - 1) {
//ArrayIndexOutOfBoundsException 数组下标异常
throw new ArrayIndexOutOfBoundsException("数组下标异常");
}
System.out.println(arr[index]);
}
}
5. 什么时候抛出,什么时候捕获
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCrKPVWE-1668214638494)(F:\qianfeng\笔记\img\抛出和捕获分析.png)]
6.运行时异常和编译时异常
目前而言最大的对比
运行时异常不会报错,编译时异常必须 Ctrl + 1处理
如果发现异常报错 Unhandled exception XXX证明当前异常为变异兽异常,必须处理
运行时异常:
常见异常,不操心的异常,不执行的异常,不认真的异常。
例如:
数组下标越界异常 ArrayIndexOfboundsException
空指针异常 NullPointException
...
运行时异常基类是 RuntimeException extends Exception
编译时异常
代码操作存在语法级别隐患,需要在代码书写过程中,对当前异常有对应的处理方法和处理办法。
例如:
文件未找到位置/文件不存在异常 FileNotFoundException
中断异常 InterruptedException
SQL 数据库 SQL 语句异常 SQLException
编译时异常父类都是 Exception
:
常见异常,不操心的异常,不执行的异常,不认真的异常。
例如:
数组下标越界异常 ArrayIndexOfboundsException
空指针异常 NullPointException
…
运行时异常基类是 RuntimeException extends Exception
编译时异常
代码操作存在语法级别隐患,需要在代码书写过程中,对当前异常有对应的处理方法和处理办法。
例如:
文件未找到位置/文件不存在异常 FileNotFoundException
中断异常 InterruptedException
SQL 数据库 SQL 语句异常 SQLException
编译时异常父类都是 Exception