java异常处理02_异常分类

1.异常体系

JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。

Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。

先来看看java中异常的体系结构图解:
在这里插入图片描述

2. Throwable

Throwable类是所有异常或错误的超类,它有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception又分为运行时异常(RuntimeException)和编译时异常。

Error和运行时异常,因为程序在编译时不检查异常,所以又称为不检查异常(Unchecked Exception)。

编译时异常,因为程序在编译时异常可以被检查出,所以又称为可检查异常(Checked Exception)

Throwable常用方法介绍:

方法名 描述
public String getMessage() 返回此throwable的详细消息字符串。
public String toString() 返回此 throwable 的简短描述
public void printStackTrace() 打印异常的堆栈的跟踪信息

3.Error(错误)

Error类是java所有错误类的父类,描述了java运行时系统内部错误和资源耗尽错误。这类错误是我们无法控制的,同时也是非常罕见的错误,表明系统JVM已经处于不可恢复的崩溃状态中,它是由JVM产生和抛出的,比如OutOfMemoryError、ThreadDeath等。

所以错误是很难处理的,一般的开发人员(当然不是你)是无法处理这些错误的,我们在编程中,可以不去处理这类错误。
在这里插入图片描述
以下是一些常见的Error案例:

【示例】内存溢出案例

public class ExceptionDemo {
	public static void main(String[] args) {
		// 数组需要1G的内存,这样子就会造成内存溢出
		int[] but = new int[1024*1024*1024]; // 1K-->1M-->1G
		System.out.println(but);
	}
}

在这里插入图片描述
【示例】栈溢出案例

public class ExceptionDemo {
	public static void main(String[] args) {
		test();
	}
	public static void test() {
		test(); // 一直递归调用,这样子就会造成堆栈溢出
	}
}

在这里插入图片描述

4.Exception(异常)

Exception类所有异常类的父类,其子类对应了各种各样可能出现的异常事件。Error是程序无法处理的错误,但是Exception是程序本身可以处理的异常,在程序中应当尽可能去处理这些异常。

Error与Exception的区别:

  1. 我开着车走在路上,一头猪冲在路中间,我刹车,这叫一个异常。

  2. 我开着车在路上,发动机坏了,我停车,这叫错误。

    发动机什么时候坏?我们普通司机能管吗?不能。发动机什么时候坏是汽车厂发动机制造商的事。

Exception又分为两大类:

  1. RuntimeException运行时异常
  2. CheckedException编译时异常

4.1运行时异常

RuntimeException 和 他 的 所 有 子 类 异 常,都 属 于 运 行 时 期 异 常 。例如:NullPointerException、ClassCastException、IndexOutOfBoundsException、ArithmeticException等。因为程序编译时异常不能被检查出,所以又称为不检查异常(UnCheckedException)。

运行时异常一般是由程序逻辑错误引起的,所以在编写程序时,我们应该从逻辑角度尽可能避免这类异常的发生。

当出现RuntimeException的时候,系统将自动检测并将它们交给缺省的异常处理程序(虚拟机接管并处理),用户可以不必对其处理。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

ArithmeticException异常,异常算术条件时抛出。例如:“除以零”的整数会抛出此类的一个实例。

【示例】ArithmeticException异常案例

public static void main(String[] args) {
	int x = 0;
	// 此处对x变量加判断,从而避免ArithmeticException异常
	int y = 3 / x; 
	System.out.println("y:" + y);
}

在这里插入图片描述
NullPointerException异常(空指针异常),当程序访问一个空对象的成员变量或方法,访问一个空数组的成员时发生。

【示例】NullPointerException异常案例

public static void main(String[] args) {
	int[] arr = null;
	// 此处判断arr是否为null,从而避免NullPointerException异常
	System.out.println(arr.length);
}

在这里插入图片描述
ClassCastException异常,当对象转换为不属于实例的子类时发生。

【示例】ClassCastException异常案例

// 父类
class Animal {}
// 子类
class Dog extends Animal {}
class Cat extends Animal {}
// 测试类
public class RuntimeDemo {
	public static void main(String[] args) {
		Animal animal = new Dog();
		// 转型之前先用instanceof判断类型,从而避免ClassCastException异常
		Cat cat = (Cat)animal;
	}
}

在这里插入图片描述
ArrayIndexOutOfBoundsException异常,当使用非法索引访问数组时发生, 索引为负数或大于或等于数组的大小。

【示例】ArrayIndexOutOfBoundsException异常案例

public static void main(String[] args) {
	int[] arr = new int[3];
	// 获取数组元素之前,先对数组索引判断
	System.out.println(arr[-1]);
}

在这里插入图片描述

4.2编译时异常

Exception及其子类(不包含运行异常),统称为编译时异常。因为程序编译时异常可以被检查出,所以又称为可检查异常(CheckedException)。

常见的编译时异常:如IOException、SQLException等以及用户继承于Exception的自定义异常。

对于编译时异常,在编译时就强制要求我们必需对出现的这些异常进行处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,都只能自己去处理可能出现的异常。

【示例】编译时异常案例
在这里插入图片描述

ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。

发布了92 篇原创文章 · 获赞 0 · 访问量 2625

猜你喜欢

转载自blog.csdn.net/zhoujunfeng121/article/details/104662074