Java面向对象【异常处理】

发布于:2023-01-10 ⋅ 阅读:(469) ⋅ 点赞:(0)

  • 运行异常并不一要求显示处理,因为有默认处理机制throws
  • 编译异常要求必须显示处理,使用try-catch或throws

try-catch

快捷键:Ctrl + Alt + t

类别

  • Error(错误):java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况,栈溢出,程序崩溃

  • Exception(异常):其他因编程或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。如空指针访问,试图读取不存在的文件等

    • Exception类别:运行时异常和编译时异常
  • 常见运行时异常

    1. NullPointerException:空指针异常
    2. ArithmeticException:数学运算异常
    3. ArrayIndexOutOfBoundsException:数组下标越界异常
    4. ClassCastException:类型转换异常
    5. NumberFormatException:数字格式不正确异常
  • 常见编译时异常

    1. SQLException:操作数据库时,查询表可能发生异常
    2. IOExceptin:操作文件时,发生的异常
    3. FileNotFoundException:当操作一个不存在的文件时,发生异常
    4. ClassNotFoundException:加载类,而该类不存在时,异常
    5. EOFException:操作文件,到文件末尾,发生异常
    6. IllegalArguementException:参数异常

try-catch-finally

  • try代码块如果有多个异常,可以使用多个catch分别捕获不同的异常,相应处理
  • 条件:要求子类异常写在前面,父类异常写在后面
  • try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉
try {
    代码(可能有异常)
}catch(Exception e) {
    // 捕获到异常
    // 当异常发生时,系统将异常封装成Exception对象e,传递给catch
    // 得到异常对象后,自行处理
}finally {
    // 不管try代码块是否有异常发生,始终要执行finally代码块
    // 通常将释放资源的代码放在此处
}

细节

执行顺序

  • 如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如果有finally,最后还需要执行finally里面的语句
  • 如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需要执行finally里面的语句!

throws

将异常抛回调用它的地方,若一直使用throws,最终会抛回给 JVM

如果是运行异常不用try-catch默认使用throws

  1. 如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理而由该方法的调用者负责处理
  2. 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以说方法中产生的异常类型,也可以是它的父类
package com.xiaolu.exception_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * @author 林小鹿
 * @version 1.0
 */
public class Throws01 {

    public static void main(String[] args) {

    }
    // 也可以用Exception替代
    public void f1() throws FileNotFoundException,NullPointerException {
        // 创建一个文件流对象
        // 使用throws,抛出异常,让调用f2方法的调用者(方法)处理
        // throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
        // throws 关键字后面也可以是 异常列表 ,即可以抛出多个异常
        // 编译异常
        FileInputStream fis = new FileInputStream("d://aa.txt");
    }

}
  • 使用throws,抛出异常,让调用f2方法的调用者(方法)处理
  • throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
  • throws 关键字后面也可以是 异常列表 ,即可以抛出多个异常
  • 如果是编译异常则必须处理

自定义异常

当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设置异常类,用于描述改错误信息

步骤

  • 定义类:自定义异常类名,继承Exception或RuntimeException
  • 如果继承Exception,属于编译异常
  • 如果继承RuntimeException,属于运行异常,一般是继承RuntimeException,因为可以使用默认的处理机制

代码

package com.xiaolu.exception_;

/**
 * @author 林小鹿
 * @version 1.0
 */
public class CustomException_ {

    public static void main(String[] args) {
        // 要求范围在 18 - 120 之间,否则抛出一个自定义异常
        int age = 800;
        if (!(age >= 18 && age <= 120)) {
            throw new AgeException("年龄需要在18~120之间");
        }
        System.out.println("你的年龄范围正确");

    }
}

// 自定义异常
// 一般是继承RuntimeException,因为可以使用默认的处理机制
class AgeException extends RuntimeException {
    public AgeException(String message) {
        super(message);
    }


}

throw和throws的区别

  • throws:处理异常的一种方式,放于方法声明处,后面跟异常类型

  • throw:手动生成异常对象的关键字,放于方法体中,后面跟异常对象

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到