java进阶打卡14

Throwable类中3个异常处理的方法

(1)String getMessage() 返回此Throwable的简短描述
例如:	System.out.println(e.getMessage());//文件的后缀名不对

(2)String toString() 返回此Throwable的详细信息字符串
例如:	System.out.println(e.toString());//java.io.IOException: 文件的后缀名不对
		System.out.println(e);//java.io.IOException: 文件的后缀名不对
		//重写Object类的toString,所以e.toString == e
		
(3)void printStackTrace() JVM打印异常对象,默认此方法,打印的异常信息是最全面的
例如:	e.printStackTrace();
		/*java.io.IOException: 文件的后缀名不对
			at day05.demo02.Demo01TryCatch.readFile(Demo01TryCatch.java:52)
			at day05.demo02.Demo01TryCatch.main(Demo01TryCatch.java:27)*/

finally代码块

格式:
    try{
        可能产生异常的代码
    }catch(定义一个异常的变量,用来接收try中抛出的异常对象) {
        异常的处理逻辑,产生异常对象之后,怎么处理异常对象
        一般在工作中,会把异常的信息记录到一个日志中
    }
    ...
    catch(异常类名 变量名){

    }finally{
        无论是否出现异常都会执行
    }
注意:
    1. finally不能单独使用,必须和try一起使用
    2. finally一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO)

异常的注意事项

  • 多异常的捕获处理
多个异常使用捕获又该如何处理呢?
1. 多个异常分别处理。
2. 多个异常一次捕获,多次处理。
3. 多个异常一次捕获一次处理。

一个try多个catch注意事项:
	catch里边定义的异常变量,如果有子父类关系,那么子类的异常变量必须写在上边,否则子类异常变量没有使用,就会报错
	ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException

try{
	int[] arr = {1, 2, 3};
    //System.out.println(arr[3]); // ArrayIndexOutOfBoundsException: 3
    List<Integer> list = List.of(1, 2, 3);
    System.out.println(list.get(3)); // IndexOutOfBoundsException:Index 3 out-of-bounds for length 3
}catch(ArrayIndexOutOfBoundsException e){
	System.out.println(e);
}catch(IndexOutOfBoundsException e){
    System.out.println(e);
}

分析:
try中可能会产生的异常对象:
	new ArrayIndexOutOfBoundsException("3");
	new IndexOutOfBoundsException("3");
try中如果出现了异常对象,会把异常对象抛出给catch处理,抛出的异常对象,会从上到下依此赋值给catch中定义的异常变量
ArrayIndexOutOfBoundsException	=	new ArrayIndexOutOfBoundsException("3");
IndexOutOfBoundsException		=	new IndexOutOfBoundsException("3");
-------------------------------------------------------------------------------------------------------
IndexOutOfBoundsException		=	new ArrayIndexOutOfBoundsException("3");	多态
IndexOutOfBoundsException		=	new IndexOutOfBoundsException("3");

多个异常一次捕获一次处理:
try{
	int[] arr = {1, 2, 3};
	//System.out.println(arr[3]); // ArrayIndexOutOfBoundsException: 3
    List<Integer> list = List.of(1, 2, 3);
    System.out.println(list.get(3)); // IndexOutOfBoundsException:Index 3 out-of-bounds for length 3
}catch(Exception e){
    System.out.println(e);
}

运行时异常被抛出可以不处理。既不捕获也不声明抛出。
默认给虚拟机处理,终止程序,什么时候不抛出运行时异常了,再来继续执行程序
  • finally有return语句
    如果finally有return语句,永远返回finally中的结果,避免该情况。
  • 子父类异常
子父类的异常:
    如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
    父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
注意:
    父类异常是什么样,子类异常就是什么样

public class Fu {
    public void show01() throws NullPointerException, ClassCastException{}
    public void show02() throws IndexOutOfBoundsException{}
    public void show03() throws IndexOutOfBoundsException{}
    public void show04(){}
}
class Zi extends Fu{
    // 子类重写父类方法时,抛出和父类相同的异常
    public void show01() throws NullPointerException, ClassCastException{}
    // 子类重写父类方法时,抛出父类异常的子类
    public void show02() throws ArrayIndexOutOfBoundsException{}
    // 子类重写父类方法时,不抛出异常
    public void show03() {}

    // 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。
    // public void show04() throws Exception{} // 错误写法!
    //此时子类产生该异常,只能捕获处理,不能声明抛出
    public void show04(){
        try {
            throw new Exception("编译期异常");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java员工打卡签到代码的实现方式有很多种,以下是其中一种可能的实现方式: ```java import java.util.Date; public class Employee { private String name; private Date lastSignIn; public Employee(String name) { this.name = name; } public void signIn() { Date now = new Date(); System.out.println(name + "签到成功,时间:" + now); lastSignIn = now; } public void signOut() { Date now = new Date(); System.out.println(name + "签退成功,时间:" + now); } public void checkInStatus() { if (lastSignIn == null) { System.out.println(name + "尚未签到"); } else { System.out.println(name + "上次签到时间:" + lastSignIn); } } } ``` 上面的代码定义了一个`Employee`类,其中包含了员工的姓名和上次签到时间。类中有三个方法:`signIn()`、`signOut()`和`checkInStatus()`。`signIn()`方法表示员工签到,会打印出员工姓名和当前时间,并将当前时间记录为上次签到时间;`signOut()`方法表示员工签退,会打印出员工姓名和当前时间;`checkInStatus()`方法表示查询员工的签到状态,会打印出员工姓名和上次签到时间(如果已经签到过),否则会提示尚未签到。 如果要使用这段代码,可以在其他类中创建`Employee`对象,并调用其中的方法来完成打卡签到功能。例如: ```java public class Main { public static void main(String[] args) { Employee emp1 = new Employee("张三"); emp1.signIn(); emp1.checkInStatus(); emp1.signOut(); } } ``` 这段代码创建了一个名为`emp1`的`Employee`对象,姓名为“张三”。接着调用了`signIn()`方法进行签到,`checkInStatus()`方法查询签到状态,最后调用了`signOut()`方法进行签退。运行这段代码后,会打印出以下结果: ``` 张三签到成功,时间:Thu Jul 22 14:47:23 CST 2021 张三上次签到时间:Thu Jul 22 14:47:23 CST 2021 张三签退成功,时间:Thu Jul 22 14:47:28 CST 2021 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值