Java SE基础学习笔记4·异常

异常

每次遇到异常都到 JDK帮助文档 去查看,有助于对异常的熟练

概述: 程序出现了不正常的情况
在这里插入图片描述

编译、运行时异常

一个写的时候红色波浪线,一个运行时报错

分类编译时异常
/ 受检异常
运行时异常
/ 非受检异常
异常类Exception类
及其子类
其他类
异常处理必须显示处理
否则程序就会发生错误,无法通过编译
无需显示处理
也可以和编译时异常一样处理
异常处理 ↓ ↓

Throwable

概述:

所有异常的父类
THrowable 异常就算捕获了也解决不了

例如:无限递归调用

public static void tast() {
	tast();	// 报错,栈溢出
}

成员方法

getMessage 和 toString 要放在 System.out.println(); 里,printStackTrace不需要
在这里插入图片描述

getMessage

异常的原因

System. out.println(e.getMessage());
// Index 3 out of bounds for length 3

toString

异常的 原因 和 异常类名

System.out.println(e.toString());
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

printStackTrace

异常的 原因 和 异常类名、异常信息
不用放在 System.out.println(); 里

e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// 异常信息

异常处理

JVM 默认处理

如果程序出现了问题,没有做任何处理,最终 JVM虚拟机 会做默认的处理 ↓

  1. 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
  2. 程序停止执行
system.out.println("开始");
int[]arr = {123};
System.out.printLn(arr[3]);
System.out.println("结束");
// 开始
// 报出异常,结束

捕获异常 try… catch…

格式:

try {
	可能出现异常的代码;
} catch (异常类名 变量名) {
	异常的处理代码;
} catch (异常类名 变量名) {
	异常的处理代码;
	...
} finally {
	最终块,无论是否有异常都会执行的代码;
}

执行流程:

  1. 程序从 try 里面的代码开始执行

  2. 没有出现异常,跳过catch 再执行finally

  3. 出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统

  4. 当Java运行时系统接收到异常对象时,会到 catch 中去找匹配的异常类,找到后进行异常的处理

  5. 执行完毕之后,进入finally

注意:

输出 999
除非return换成

System.exit(1);

案例:
如果异常没有被捕捉住,那只会输出 “开始” “finally块”

System.out.println("开始");

try {
	int[]arr = {1,2,3};
	System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
	System.out.printLn("你访问的数组的索引不存在");
	abnormal.printStackTrace();
} finally {
	System.out.println("finally块");
}
System.out.println("结束");
/*
开始
你访问的数组的索引不存在
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
finally块
结束
(异常信息)
*/

throws 抛出异常

不是所有的情况都有权限通过 try…catch… 对异常进行处理,这种情况就要用 throws

如果采用throws这种方案,将来谁调用这个方法谁处理

因为 throws 的本质是 抛出异常最终还是要用 try…catch… 来处理异常的
格式:

方法名() throws 异常类名 {
}

案例:

public static void main(String[] arge) {	
	System.out.println("开始");

	try {
		method();
	} catch (ParseException e) {
		e.printStackTrace();
	}

	System.out.println("结束");		
}
	
	// 编译时异常
public static void method() throws ParseException {
	String s = "2022-02-12";
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	Date d = sdf.parse(s);
	System.out.println(d);
}
/*
开始
Sat Feb 12 00:00:00 CST 2022
结束
*/

自定义异常

比如想要让大于100的成绩报异常,只需要定义一个 Exception 的子类就行
格式:

public class 异常类名 extends Exception {
	无参构造
	带参构造
}

范例:

public class scoreException extends Exception {
	public scoreException () {}
	public scoreException (string message){
		super (message) ;
	}
}





后续
后续内容在《Java SE基础学习笔记5·集合》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值