day13-异常

文章介绍了Java中的异常处理机制,包括try-catch、try-catch-finally、多重catch、throws和自定义异常的使用。同时,也详细讲解了Object类的基本方法,如equals、toString、finalize和clone的功能和注意事项。
摘要由CSDN通过智能技术生成

一、异常


1、什么是异常

  • 异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
  • Java编程语言使用异常处理机制为程序提供了错误处理的能力

在这里插入图片描述

2、异常处理

Java的异常处理是通过5个关键字来实现的:try、catch、finally、throw. throws

一、try catch

在这里插入图片描述
在这里插入图片描述

二、try catch finally

  • 在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行【除非干掉了虚拟机】 在 return 前执行
  • try-catch-finally 也可以嵌套try-catch-finally 实现更精确的异常控制。
    如果finally 块中有返回语句,finally 的返回内容会覆盖try 或 catch块中的返回内容。
  • 注意:finally块中不能修改返回值,但可以修改返回对象的内容。
  • finally主要执行close方法,可以使用try(具有close方法的对象)来省略finally
public class demo01 {
    public static void main(String[] args) {
        System.out.print("请输入年龄:");

        // 自动执行finally -- > close
        try(Scanner scanner = new Scanner(System.in)) {
            int age = scanner.nextInt();
            System.out.println("年龄为:" + age);
        } catch (Exception e) {
            System.err.println("请输入数字!");
            e.printStackTrace();
        }
    }
}

三、多重catch

  • —段代码可能会引发多种类型的异常
  • 当引发异常时,会按顺序来查看每个catch语句,并执行第一个与异常类型匹配的catch语句
  • 执行其中一条catch语句后,其后catch语句将被忽略
public class Demo03 {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            System.out.print("请输入第一个数:");
            int i = sc.nextInt();
            System.out.print("请输入第二个数:");
            int j = sc.nextInt();
            int rs = i / j;
            System.out.println("计算结果:" + rs);
            System.out.println(args[0]);
        } catch (ArithmeticException e) {
            System.err.println("数学异常");
            e.printStackTrace();
        }catch (ArrayIndexOutOfBoundsException e) {
            System.err.println("数组下标越界");
            e.printStackTrace();
        }
    }
}

还可以写成如下方式:

public class Demo03 {
    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            System.out.print("请输入第一个数:");
            int i = sc.nextInt();
            System.out.print("请输入第二个数:");
            int j = sc.nextInt();
            int rs = i / j;
            System.out.println("计算结果:" + rs);
            System.out.println(args[0]);
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
    }
}

四、throws

在这里插入图片描述

public class Test03 {

    public static void main(String[] args) throws Exception {
        Date date = dateFormat("2023-04-24");
        System.out.println(date);
    }

    /**
     * DateUtil工具
     * @param str   日期字符串
     * @return      Date格式数据
     * @throws Exception    异常提示
     */
    public static Date dateFormat(String str) throws Exception {
        String[] pattern = {"yyyy-MM-dd","yyyy/MM/dd","yyyy年MM月dd日"};
        for (String s : pattern) {
            try {
                DateFormat sdf = new SimpleDateFormat(s);
                return sdf.parse(str);
            } catch (ParseException e) {
                // e.printStackTrace();
            }
        }
        throw new Exception("暂时不支持其他格式");
    }
}

五、自定义异常

在这里插入图片描述

public class LoginException extends Exception{

    public LoginException() {
        super("账号或密码错误");
    }
}
public class LockException extends Exception{

    public LockException() {
        super("账号锁定!");
    }
}
public class Demo04 {

    public static void main(String[] args) {
        try {
            login("zhangsan","123");
            System.out.println("登录成功!");
        } catch (LockException | LoginException e) {
            e.printStackTrace();
        }
    }

    public static void login(String account, String password) throws LockException, LoginException {
        if ("zhangsan".equals(account)){
            throw new LockException();
        }
        if (!("admin".equals(account) && "123".equals(password))){
            throw new LoginException();
        }
    }

}

在这里插入图片描述

3、异常体系(分类)

在这里插入图片描述
在这里插入图片描述

异常的默认处理流程
在这里插入图片描述

二、Object


1、概述

  • 在Java中,Object类是所有类的祖宗类。
  • 没有extends语句的类声明含有extends Object。
  • 示例:
    • public class Employee {…}
      等同于∶
    • public class Employee extends Object {…}
  • 两个重要的方法是︰
    • equals
    • toString

2、equals

  • ==运算符确定两个引用是否相同(即引用同一对象)。
  • equals方法确定对象逻辑上是否相等,但没必要相同。
  • equals方法的Object 实现使用==运算符。
  • 用户类可以覆盖equals方法来实现特定域的相等测试。

3、toString

  • 该方法将对象转换成 String。该方法用于字符串连接。
  • 通过覆盖此方法以提供给用户更为易读的对象信息。
  • 使用wrapper 类的toString静态方法来将基本类型转换为String。

4、finalize

  • 当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize方法。如果在程序终止之前垃圾回收器始终没有执行垃圾回收操作,那么垃圾回收器将始终不会调用无用对象的finalize方法。
  • finalize方法的特点︰
    • 垃圾回收器是否会执行该方法及何时执行该方法,都是不确定的。
    • finalize方法有可能使对象复活,使它恢复到可触及状态。
    • 垃圾回收器在执行finalize方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行。
      对finalize方法的最佳忠告就是,永远不要使用该方法。

5、clone

  • clone 用于实现对象的克隆/拷贝。
  • 要使用clone方法的对象,要实现Cloneable接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值