Java异常整体架构

什么是异常

在Java中,“程序执行过程中发生的中断正常指令流的事件”称为异常。 这通常是在应用程序代码的编译时或运行时发生的意外。

Java异常架构

Java中定义的标准异常和错误类:

所有异常和错误类型都是Throwable的子类 ,Throwable类是层次结构的基类。 一个分支是Exception,这个类用于用户程序应该捕获的异常, NullPointerException就是此类异常的一个例子。 另一个分支是Error,表示Java运行时系统(JVM)用于指示与运行时环境本身(JRE)有关的错误, StackOverflowError就是这种错误的一个例子。

Error

根据官方文档,错误“表明合理的应用程序不应该试图捕捉的严重问题”。 这指的是应用程序无法恢复,它们应该通过 修改应用程序架构或重构 代码来处理。

请看下面代码:

public static String get() {
	try {
		return get();
	} catch (Exception e) {
		System.out.println("发生错误");
	}
	return null;
}

我们递归了get方法,导致线程栈溢出,从而抛出了StackOverflowError错误(间接继承自Error),这种错误就一个特点:

表示严重问题,程序无法处理的错误,你try异常都没用,程序照样退出。

Exception

Exception 是 Java 程序运行中可预料的异常情况,我们可以获取到这种异常,并且对这种异常进行业务外的处理。它分为检查性异常和非检查性(RuntimeException)异常。

检查性异常

是在编译时检查的异常。 如果方法中的某些代码抛出了一个检查过的异常,那么该方法要么必须处理该异常,要么必须使用throws关键字指定异常。 请看下面例子:

public void writeToFile() {
	try (BufferedWriter bw = new BufferedWriter(new FileWriter("myFile.txt"))) {
		bw.write("Test");
	} catch (IOException ioe) {
		ioe.printStackTrace();
	}
}

write方法就抛出的检查性异常IOException:

检查性异常 必须要手动try处理,或者抛给上层调用,否则就会编译通不过。

非检查性

非检查异常是在运行时抛出的异常。 因此,方法不必显式捕获或抛出未检查的异常。 继承或间接继承 RuntimeException 的类是未检查的异常。 值得注意的是Error也是非检查性异常

请看下面实例:

public static void main(String[] args) {
	BufferedWriter bw = null ;
	writeToFile(bw);
}

public static void writeToFile(BufferedWriter bw) {
	try {
		bw.write("Test");
	} catch (IOException ioe) {
		ioe.printStackTrace();
	}
}

上面代码使用了一个null的对象,因此会抛出空指针异常(继承自RuntimeException ),由于是非检查性异常,因此在编译层面不需显示进行处理和抛出。

但是在我们写代码时, 必须进行空判断 ,使程序健壮性更加:

public static void main(String[] args) {
	BufferedWriter bw = null ;
	writeToFile(bw);
}

public static void writeToFile(BufferedWriter bw) {
	if(bw == null) {
		System.out.println("写文件对象不能为空");
		return ;
	}
	try {
		bw.write("Test");
	} catch (IOException ioe) {
		ioe.printStackTrace();
	}
}

常见的几个RuntimeException非检查性异常 :


强力推荐一个Java架构师修炼博客,全是干货

JAVA架构师修炼

支付宝打赏 微信打赏

如果文章对您有帮助,您可以鼓励一下作者