异常概念:不是正常的情况
-
Java 异常是编程中很重要的一个概念。
-
用于处理程序运行过程中可能出现的错误或异常情况。
-
异常是程序在执行过程中产生的一个特殊的情况,它会中断正常的执行流程,所以需要程序员进行相应的处理。
Java中异常分为两类:检查性异常和非检查时异常
-
检查性异常是必须显式处理的异常。在编写代码时。编译器会强制要求你使用throws或者try-catch关键字来处理这些异常
-
常见的检查时异常:IOException IO异常、FileNotFoundException文件找不到异常
-
非检查时异常是运行时异常基类。它们通常是因为程序错误导致的异常。
-
常见的非检查时异常:NullPointerException 空指针异常,ArrayIndexOutOfBoundsException 数组下标越界,ArithmeticException 算数异常
异常的处理:
1.检查时必须处理
2.非检查时异常,也需要处理。
- 异常处理的方式(二种):
-
捕获异常(try - catch -finally),在代码块中捕获并处理异常。如果try块中的代码出现异常。交给catch 处理。
finally块是可选的,无论是否发生异常,finally块都将执行。这对于资源的清理非常有用。例如关闭流或数据库连接 -
抛出异常(Throws):在方法声明上使用throws关键字发声明该方法可能抛出的异常。谁调用这个方法谁解决。
System.out.println("1.程序开始执行");
try{
System.out.println("2.我会打印吗?");
//可能出现异常的代码
System.out.println(1/0);
System.out.println("3.我会打印吗?");
}catch (ArithmeticException ae){//()里写异常的类型
System.out.println("4.我会打印吗?");
//处理异常 printStackTrace()将异常打印到控制台
ae.printStackTrace();
System.out.println("5.我会打印吗?");
}finally {
//可选:无论有没有异常都会执行的代码
//关闭流/释放资源
System.out.println("6.无论怎样,我都会执行..");
}
System.out.println("7.程序运行结束");
throw:"throw"关键字用来在方法内部手动抛出一个异常。
- 当遇到特殊的错误条件时,程序员可以使用"throw"来抛出一个异常
会结合自定义异常类来使用 - 创建一个异常类 继承RuntimeException 运行时异常
public class IXiaoYu0Exception extends RuntimeException{
//生成一个构造方法
public IXiaoYu0Exception(String message) {
super(message);
}
}
- 当输入的参数i<0时,手动抛出一个异常
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
//特殊的错误条件:i<0异常
if(i<0){
//非受检异常,运行时异常
throw new IXiaoYu0Exception("i不能小于0");
}
}
课堂练习:处理文件读取的异常
public class ExceptionLianXi1 {
public static void main(String[] args) {
//创建一个File对象
File file = new File("src\\week7\\day1\\抄写笔记.txt");
//先声明再赋值
BufferedReader br = null;
try{
//创建一个FileReader对象
FileReader fr = new FileReader(file);
//异常代码
System.out.println(1/0);
//创建一个BufferedReader 对象
br = new BufferedReader(fr);
String line;
while((line=br.readLine())!=null){
System.out.println(line);
}
}catch (FileNotFoundException ffe){
//处理文件找不到异常
ffe.printStackTrace();
}catch (IOException ie){
//处理IO流异常
ie.printStackTrace();
}catch (ArithmeticException ae){
System.out.println("算术异常");
}finally {
//关闭流对象
try{
//避免空指针异常
if(br!=null)
br.close();
}catch (IOException ie){
//处理异常
ie.printStackTrace();
}
}
}
}