文章目录

  • 异常
  • 编译、运行时异常
  • Throwable
  • 成员方法
  • getMessage
  • toString
  • printStackTrace
  • 异常处理
  • JVM 默认处理
  • 捕获异常 try... catch...
  • throws 抛出异常
  • 自定义异常


异常

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

概述: 程序出现了不正常的情况

java 实现telnet ip端口命令 java traceroute_类名

编译、运行时异常

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

分类

编译时异常

/ 受检异常

运行时异常

/ 非受检异常

异常类

Exception类

及其子类

其他类

异常处理

必须显示处理

否则程序就会发生错误,无法通过编译

无需显示处理

也可以和编译时异常一样处理

异常处理 ↓ ↓

Throwable

概述:

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

例如:无限递归调用

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

成员方法

getMessage 和 toString 要放在 System.out.println(); 里,printStackTrace不需要

java 实现telnet ip端口命令 java traceroute_System_02

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 = {1,2,3};
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·集合》