龙空技术网

Java异常处理知识体系

心有花宇龙传人 169

前言:

眼前咱们对“java异常体系”都比较关怀,你们都想要剖析一些“java异常体系”的相关知识。那么小编在网络上汇集了一些有关“java异常体系””的相关知识,希望大家能喜欢,各位老铁们快快来学习一下吧!

Java异常处理知识体系什么是异常

生活中的异常:例如感冒发烧,工作时电脑蓝屏、死机等。

程序中的异常:在程序运行的过程中,也会发生这种非正常状况,例如程序运行时磁盘空间不足、网络连接中断、被加载的类不存在等。

程序异常解决方法:针对程序中的非正常情况,Java语言中引入了异常,以异常类的形式对这些非正常情况进行封装,并通过异常处理机制对程序运行时发生的各种问题进行处理。

1.1异常的体系结构1.1.1Exception异常类

称为异常类,它表示程序本身可以处理的错误。在Java程序开发中进行的异常处理,都是针对Exception类及其子类的。

1.1.2Error错误

称为错误,表示Java运行时产生的系统内部错误或资源耗尽的错误,是比较严重的,仅靠修改程序本身是不能恢复执行的,例如系统崩溃,虚拟机错误等。

1.1.3Throwable类中的常用方法

方法声明

功能描述

String getMessage()

返回此throwable的详细消息字符串

void printStackTrace()

将此throwable及其追踪输出至标准错误流

void printStackTrace(PrintStream s)

将此throwable及其追踪输出到指定的输出流

String getMessage()

返回此throwable的详细消息字符串

异常的类型

1、编译时异常

在程序编译时期产生的异常,而这些异常必须要进行处理,也称为checked异常。

2、运行时异常

这种异常即使不编写异常处理代码,依然可以通过编译,也称为unchecked异常。

2.1编译时异常

异常类汇总:在Exception的子类中,除了RuntimeException类及其子类外,其他子类都是编译时异常。

特点:编译时异常的特点是在程序编写过程中,Java编译器就会对编写的代码进行检查,如果出现比较明显的异常就必须对异常进行处理,否则程序无法通过编译。

处理编译时异常的方式如下:

(1)使用try...catch语句对异常进行捕获处理;

(2)使用throws关键字声明抛出异常,让调用者处理。

2.2运行时异常

异常汇总:RuntimeException类及其子类都是运行时异常。

特点:运行时异常是在程序运行时由Java虚拟机自动进行捕获处理的,即使没有使用try..catch语句捕获或使用throws关键字声明抛出,程序也能编译通过,只是在运行过程中可能报错。

Java中常见的运行时异常如下:

异常类名称

异常类说明

ArithmeticException,

算术异常

IndexOutOfBoundsException

角标越界异常

ClassCastException

类型转换异常

NullPointerException

空指针异常

NumberFormatException

数字格式化异常

运行时异常错误分析:运行时异常一般是由于程序中的逻辑错误引起的,在程序运行时无法恢复。

运行时异常示例如下:

int [] arr=new int[5];

System.out.println(arr[5]);

三、try...catch和finally

当程序发生异常时,会立即终止,无法继续向下执行。为了保证程序能够有效的执行,Java中提供了一种对异常进行处理的方式——异常捕获。

异常捕获try…catch语句的基本语法格式:

try {

// 可能发生异常的语句

} catch(Exception类或其子类 e){

// 对捕获的异常进行相应处理

}

注意:在try{}代码块中,发生异常语句后面的代码是不会被执行的。在程序中,如果希望有些语句无论程序是否发生异常都要执行,这时就可以在try…catch语句后,加一个finally{}代码块。

异常捕获try…catch...finally语句的基本语法格式:

try {

// 可能发生异常的语句

} catch(Exception类或其子类 e){

// 对捕获的异常进行相应处理

} finally {

// 无论是否发生异常,此代码块代码总会执行

}

四、throws关键字

如果不确定或者并不急于处理异常,怎么办?

一般在程序开发中,开发者通常会意识到程序可能出现的问题,可以直接通过try...catch对异常进行捕获处理。但有些时候,方法中代码是否会出现异常,开发者并不明确或者并不急于处理,为此,Java允许将这种异常从当前方法中抛出,然后让后续的调用者在使用时再进行异常处理。

throws关键字抛出异常的基本语法格式:

[修饰符] 返回值类型 方法名([参数类型 参数名1...]) throws 异常类1,异常类2,... {

// 方法体...

}

throws关键字需要写在方法声明的后面,并在后面需要声明方法中发生异常的类型

注意:当调用者在调用有抛出异常的方法时,除了可以在调用程序中直接进行try…catch异常处理外,也可以根据提示使用throws关键字继续将异常抛出,这样程序也能编译通过。但是,程序发生了异常,终究是需要进行处理的,如果没有被处理,程序就会非正常终止。

五、throw关键字

程序开发中,除了可以通过throws关键字抛出异常外,还可以使用throw关键字抛出异常。

throws关键字:throw关键字用于方法体内,并且抛出的是一个异常类对象。

throw关键字:throws关键字用在方法声明中,用来指明方法可能抛出的多个异常。

说明:通过throw关键字抛出异常后,还需要使用throws关键字或try…catch对异常进行处理。

注意:如果throw抛出的是Error、RuntimeException或它们的子类异常对象,则无需使用throws关键字或try…catch对异常进行处理。

throw关键字抛出异常的基本语法格式:

[修饰符] 返回值类型 方法名([参数类型 参数名,...]) throws 抛出的异常类 {

// 方法体...

throw new Exception类或其子类构造方法;

}

六、自定义异常

Java中定义了大量的异常类,虽然这些异常类可以描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况,例如在设计divide()方法时不允许被除数为负数

解决方法:Java允许用户自定义异常,但自定义的异常类必须继承自Exception或其子类。

自定义异常的创建示例:

public class DivideByMinusException extends Exception{

public DivideByMinusException (){

super(); // 调用Exception无参的构造方法

}

public DivideByMinusException (String message){

super(message); // 调用Exception有参的构造方法

}

}

七、垃圾回收

为什么需要有垃圾回收机制?

在Java中,当一个对象成为垃圾后仍会占用内存空间,时间一长,就会导致内存空间的不足。

针对内存空间不足的情况,Java中引入了垃圾回收机制(Java GC)。

有了垃圾回收机制,程序员不需要过多关心垃圾对象回收的问题,Java虚拟机会自动回收垃圾对象所占用的内存空间。

对象在内存中的状态转换:

一个对象在彻底失去引用成为垃圾后会暂时地保留在内存中,当这样的垃圾堆积到一定程度时,Java虚拟机就会启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更多可用的内存空间。

注意:虽然通过程序可以控制一个对象何时不再被任何引用变量所引用,但是却无法精确的控制Java垃圾回收的时机。

回收方式:除了等待Java虚拟机进行自动垃圾回收外,还可以通知系统垃圾回收器进行垃圾回收。

通知系统回收器的方式:

调用System类的gc()静态方法:System.gc()。

调用Runtime对象的gc()实例方法:Runtime.getRuntime.gc()。

说明:以上两种方式可以通知启动垃圾回收器进行垃圾回收,但是否立即进行垃圾回收依然具有不确定性。多数情况下,执行后总是有一定的效果。

当一个对象在内存中被释放时,它的finalize()方法会被自动调用,finalize()方法是定义在Object类中的实例方法。

任何Java类都可以重写Object类的finalize()方法,在该方法中清理该对象占用的资源。如果程序终止之前仍然没有进行垃圾回收,则不会调用失去引用对象的finalize()方法来清理资源

只有当程序认为需要更多的额外内存时,垃圾回收器才会自动进行垃圾回收。

标签: #java异常体系