Java 05异常

异常

异常顾名思义不正常,就是在在软件运行过程发生的不正常的事件。

异常的处理机制

java对于可能出现的异常预先想好了一些处理的方法,在运行时万一发生异常程序按照预定的处理办法对异常进行处理。

Java的异常处理五个关键字:try、catch、finally、throw、throws

异常的分类

作为所有异常类共同的“祖先”,Throwable 在“下一代”即分化为两个分支:Exception(异常)和 Error(错误),二者是 Java 异常处理的重要子类。
在这里插入图片描述
子类详解


Error 类层次结构用于描述 Java 运行时系统的内部错误和资源耗尽错误,这类错误是程序无法处理的严重问题,一旦出现,除了通告给用户并尽可能安全终止程序外,别无他法。
常见的错误如:

JVM 内存资源耗尽时出现的 OutOfMemoryError
栈溢出时出现的 StackOverFlowError
类定义错误 NoClassDefFoundError

这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,它们在应用程序的控制和处理能力之外,一旦发生,Java 虚拟机一般会选择线程终止。


Exception
相较于 Error,Exception 类层次结构所描述的异常更需要 Java 程序设计者关注,因为它是程序本身可以处理的。Exception 类的“下一代”分化为两个分支:RuntimeException + 其它异常。
划分两个分支的原则为:

由程序错误导致的异常属于 RuntimeException;
而程序本身没有问题,但由于 I/O 错误之类问题导致的异常属于其它异常。

扫描二维码关注公众号,回复: 9210057 查看本文章

关于异常和错误的区别:通俗地讲,异常是程序本身可以处理的,而错误则是无法处理的。

可检查异常:

可检查异常也称为已检查异常(Checked Exception),这类异常是编译器要求必须处置的异常。在工程实践中,程序难免出现异常,其中一些异常是可以预计和容忍的,比如:
读取文件的时候可能出现文件不存在的情况(FileNotFoundException),但是,并不希望因此就导致程序结束,那怎么办呢?

通常采用捕获异常(try-catch)或者抛出异常(throws 抛出,由调用方处理)的方式来处理。
可检查异常虽然也是异常,但它具备一些重要特征:可预计、可容忍、可检查、可处理。因此,一旦发生这类异常,就必须采取某种方式进行处理。

Java 语言规范将派生于 Error 类或 RuntimeException 类之外的所有异常都归类为可检查异常,Java 编译器会检查它,如果不做处理,无法通过编译。
不可检查异常
与可检查异常相反,不可检查异常(Unchecked Exception)是 Java 编译器不强制要求处置的异常。Java 语言规范将 Error 类和 RuntimeException 及其子类归类为不可检查异常。
为什么编译器不强制要求处置呢?不是因为这类异常简单,危害性小,而是因为这类异常是应该尽力避免出现的,而不是出现后再去补救。以 RuntimeException 类及其子类为例:

NullPointerException(空指针异常)
IndexOutOfBoundsException(下标越界异常)
IllegalArgumentException(非法参数异常)

这些异常通常是由不合理的程序设计和不规范的编码引起的,工程师在设计、编写程序时应尽可能避免这类异常的发生,这是可以做到的。在 IT 圈内有个不成文的原则:如果出现 RuntimeException 及其子类异常,那么可认为是程序员的错误。

异常处理方式 try-catch-finally

try {
可能发生异常的代码块
} catch (某种类型的异常 e) {
对于这种异常的处理代码块
} finally {
处理未尽事宜的代码块:如资源回收等
}

多重catch快

将可能出现的异常分别捕捉,给出不同的处理方式,若捕捉到一个catch块其他catch不在执行直接跳过到finally块。

try {
可能发生异常的代码块
} catch (类型A的异常 e) {
对于这种异常的处理代码块
} catch (类型B的异常 e) {
对于这种异常的处理代码块
} catch (类型C的异常 e) {
对于这种异常的处理代码块
} finally {
处理未尽事宜的代码块:如资源回收等
}

声明异常

使用throws声明某个方法可能抛出的各种异常,可以同时抛出对个异常,用逗号隔开。

在方法体后面跟上 throws Exception(或者可能出现的多个异常)
方式一:
然后在main方法中写入try-catch块捕获并处理。
方式二:
在main方法后面继续声明异常由让上一级调用者处理异常。

抛出异常

在无法解决参数问题情况下,引出通过throw抛出异常,将问题转交给调用者去解决。

public void setAge(int a){
	if(a<18){
	throw new Exception("无效值!");
	}else{
	this.age=a;
	}
}

开源日志log4j使用

log4j Read Morej详解

发布了10 篇原创文章 · 获赞 7 · 访问量 687

猜你喜欢

转载自blog.csdn.net/weixin_44924238/article/details/103047861