java的throwable子类_lang——Throwable子类

本文导引:

Throwable概述

Throwable是lang包的一级子类,是 Java 语言中所有错误或异常的超类。

Throwable有两个子类,即Error 和Exception。

Error

用于指示合理的应用程序不应该试图捕获的严重问题

不会被捕获 --> 不会被处理

包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理

Exception

应用程序想要捕获的错误异常

需要被处理

有些异常在编写程序时无法预料的,如中断异常、非法存取异常等

Error  VS  Exception

java.lang.Error自身及其子类不需要try-catch语句的支持,可在任何时候将返回方法,如下面的方法定义:

public String myMethod() {

throw new MyError();

}

其中MyError类是java.lang.Error类的子类。

java.lang.Exception自身及其子类需要try-catch语句的支持,如下的方法定义是错误的:

public String myMethod() {

throw new MyException();

}

正确的方法定义如下:

public String myMethod() throws MyException {

throw new MyException();

}

其中MyException类是java.lang.Exception的子类。

Throwable 运行

异常是当JVM(JAVA虚拟机)在执行应用程序的某个方法的时候遇到的非正常现象,JVM就会生成一个异常对象,抛给客户以便客户进行异常处理。Struts框架的异常处理机制建立在java异常处理的基础之上。在研究Struts异常处理之前,先回顾一下java异常处理原理,理解java虚拟机JVM的异常处理过程有助于应用设计正确的异常处理方法。处理异常需要JVM付出不小的开销,所以用于必须慎重使用。

JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对象,它封装了异常信息。Error是程序本身无法恢复的严重错误,Exception则表示可以被程序捕获并处理的异常错误。

JVM用方法调用栈来跟踪每个线程中一系列的方法调用过程,该栈保存了每个调用方法的本地信息。对于独立的JAVA程序,可以一直到该程序的main方法。

1. 当一个新方法被调用的时候,JVM把描述该方法的栈结构置入栈顶,位于栈顶的方法为正确执行的方法。当一个JAVA方法正常执行完毕,JVM回从调用栈中弹处该方法的栈结构,然后继续处理前一个方法。

2. 如果java方法在执行代码的过程中抛出异常,JVM必须找到能捕获异常的catch块代码:先查看当前方法是否贼这样的catch代码块,如果存在就执行该catch代码块,否则JVM回调用栈中弹处该方法的栈结构,继续到前一个方法中查找合适的catch代码块。

3. 最后,如果JVM向上追到了main()方法,也就是一直把异常抛给了main()方法,仍然没有找到该异常处理的代码块,该线程就会异常终止,如果该线程是主线程,应用程序也随之终止,此时JVM将把异常直接抛给用户,在用户终端上会看到原始的异常信息。

---------------------------------------------------------------------

代码分析:

1. 如果代码中有一个地方发生了异常, 也就是Throwable被new出来的那个地方,由于Throwable的构造函数中直接调用了fillInStackTrace(), 那么Throwable会一步一步地追踪方法的调用,直到追踪到线程的终端, 例如,main线程的main()方法,其他的线程的run()方法。

2. fillInStackTrace是native方法,也只有native方法可以完成这样的代码追踪。

3. Throwable有一个方法setStackTrace()之外(注意到setStackTrace只是use by RPC frameworks and other advanced systems),也就是说setStackTrace()通常不会被应用程序用到。

4. 跟setStackTrace()相反,StackTrace中的信息可以通过调用fillInStackTrace()方法来获得,此外还可以通过deserialize的方法来获得;可以看看它的writeObject()方法。

5. fillInStackTrace()方法返回的Throwable为this指针; 这样可以很方便的使用throw ex.fillInStackTrace();

Throwable方法

子类一般只重写部分构造方法,调用父类方法

构造方法

null 作为其详细消息的新 throwable

String message) : 构造带指定详细消息的新 throwable

String message, Throwable cause) : 带指定详细消息和 cause 的新 throwable

Throwable cause) : 带指定 cause 和 (cause==null ? null :cause.toString())(它通常包含类和 cause 的详细消息)的详细消息的新 throwable。

一般方法

序号

返回

方法

说明

备注

2

返回此 throwable 的 cause;如果 cause 不存在或未知,则返回 null。

3

将此 throwable 的 cause 初始化为指定值。

6

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

7

void

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

常见方法

8

void

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

常见方法

9

void

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

11

返回此 throwable 的简短描述。

内部调用

常见异常

图1 Error类的常见子类

9bba56ea8ae82eb97862e6e81a4e5597.png

图2 Exception类的常见子类

01d9f828b769bf1638dd557fdcb8e0fb.png

图3 RuntimeException类的常见的子类

ebb990e7d6b6041dc38eedb4b51171e5.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值