Java 基础教程

Java 获取异常信息

在 Java 中,Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。

Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause(原因),另一个导致此 throwable 抛出的 throwable。此 cause 在 Java 1.4 版本中引入,它也称为异常链,因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。

导致 throwable cause 的一个理由是,抛出它的类构建在低层抽象之中,而高层操作由于低层操作的失败而失败。让低层抛出的 throwable 向外传播是一种糟糕的设计方法,因为它通常与高层提供的抽象不相关。此外,这样做将高层 API 与其实现细节关联起来,假定低层异常是经过检查的异常。抛出 “经过包装的异常”(即包含 cause 的异常)允许高层与其调用方交流失败详细信息,而不会招致上述任何一个缺点。这种方式保留了改变高层实现而不改变其 API 的灵活性(尤其是,异常集合通过其方法抛出)。

Throwable 重要子类

Throwable 类有两个重要子类:Error 和 Exception,用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。

Error

Error 表示严重的系统错误,通常是由于虚拟机或底层系统出现问题导致的,例如 OutOfMemoryError(内存溢出错误)和 StackOverflowError(栈溢出错误)。Error 通常是无法被程序员处理的,因为它们表示系统级别的问题,程序无法恢复。

Exception

Exception 表示可以被程序员处理的异常。它又分为两种类型:已检查异常(checked exception)和未检查异常(unchecked exception)。

(1)已检查异常:已检查异常是指在编译时强制要求程序员处理的异常,即需要在代码中进行捕获或声明抛出。例如 IOException(输入输出异常)和 SQLException(SQL异常)。

(2)未检查异常:未检查异常是指在编译时不需要强制要求程序员处理的异常,即不需要在代码中进行捕获或声明抛出。通常是由程序内部的错误或错误使用导致的,例如NullPointerException(空指针异常)和 ArrayIndexOutOfBoundsException(数组越界异常)。

Throwable 常用方法

rowable 类提供了一些常用的方法,例如 getMessage() 用于获取异常的详细信息,printStackTrace() 用于打印异常的堆栈跟踪信息。如下:

  • Throwable fillInStackTrace()  在异常堆栈跟踪中填充。

  • Throwable getCause()  返回此 throwable 的 cause;如果 cause 不存在或未知,则返回 null。

  • String getLocalizedMessage()  创建此 throwable 的本地化描述。

  • String getMessage()  返回此 throwable 的详细消息字符串。

  • StackTraceElement[] getStackTrace()  提供编程访问由 printStackTrace() 输出的堆栈跟踪信息。

  • Throwable initCause(Throwable cause)  将此 throwable 的 cause 初始化为指定值。

  • void printStackTrace()  将此 throwable 及其追踪输出至标准错误流。

  • void printStackTrace(PrintStream s)  将此 throwable 及其追踪输出到指定的输出流。

  • void printStackTrace(PrintWriter s)  将此 throwable 及其追踪输出到指定的 PrintWriter。

  • void setStackTrace(StackTraceElement[] stackTrace)  设置将由 getStackTrace() 返回,并由 printStackTrace() 和相关方法输出的堆栈跟踪元素。

  • String toString()  返回此 throwable 的简短描述。

示例

通过 URL 解析一个错误的 URL 地址,然后通过 try...catch 捕获到异常,输出异常的本地化描述、详细错误消息、简单描述和打印堆栈轨迹到控制天,代码如下:

public class Demo {

   public static void main(String[] args) {
       try {
           new Demo().parseUrl("htp://www.hxstrive.com");
       } catch (MalformedURLException e) {
           // 获得此 Throwable 的本地化描述
           System.out.println(e.getLocalizedMessage());
           // 获得此 Throwable 的详细消息字符串
           System.out.println(e.getMessage());
           // 获得此 Throwable  的简短描述
           System.out.println(e.toString());
           // 将此 Throwable 及其栈踪迹输出至标准错误流
           e.printStackTrace();
       }
   }

   private URL parseUrl(String url) throws MalformedURLException {
       return new URL(url);
   }

}

运行示例,输出如下:

unknown protocol: htp
unknown protocol: htp
java.net.MalformedURLException: unknown protocol: htp
java.net.MalformedURLException: unknown protocol: htp
at java.net.URL.<init>(URL.java:593)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at com.hxstrive.demo.Demo.parseUrl(Demo.java:25)
at com.hxstrive.demo.Demo.main(Demo.java:11)
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号