lang——Throwable子类

本文导引:

  • 概述
  • Error 和Exception应用的区别
  • 运行原理
  • 方法简介
  • 常见异常


Throwable概述

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

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

  • Error

    • 用于指示合理的应用程序不应该试图捕获的严重问题
    • 不会被捕获 --> 不会被处理
    • 包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理
    • 常见异常
  • Exception
    • 应用程序想要捕获的错误异常
    • 需要被处理
    • 有些异常在编写程序时无法预料的,如中断异常、非法存取异常等
    • 常见异常

--> top



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的子类。

--> top



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();

--> top



Throwable方法

  • 子类一般只重写部分构造方法,调用父类方法
  • 构造方法
    • Throwable() :   null 作为其详细消息的新 throwable
    • Throwable(String message) : 构造带指定详细消息的新 throwable
    • Throwable(String message, Throwable cause) : 带指定详细消息和 cause 的新 throwable
    • Throwable(Throwable cause) : 带指定 cause 和 (cause==null ? null :cause.toString())(它通常包含类和 cause 的详细消息)的详细消息的新 throwable。
  • 一般方法
序号 返回 方法 说明 备注
1 Throwable fillInStackTrace() 在异常堆栈跟踪中填充。  内部调用
2 Throwable getCause() 返回此 throwable 的 cause;如果 cause 不存在或未知,则返回 null  
3 Throwable initCause(Throwable cause) 将此 throwable 的 cause 初始化为指定值。  
4 StackTraceElement getStackTrace() 提供编程访问由 printStackTrace() 输出的堆栈跟踪信息。  
5 String getLocalizedMessage() 创建此 throwable 的本地化描述。  
6 String getMessage() 返回此 throwable 的详细消息字符串。  
7 void printStackTrace() 将此 throwable 及其追踪输出至标准错误流。  常见方法
8 void printStackTrace(PrintStream s) 将此 throwable 及其追踪输出到指定的输出流。  常见方法
9 void printStackTrace(PrintWriter s) 将此 throwable 及其追踪输出到指定的 PrintWriter。  
10 void setStackTrace(StackTraceElement[] stackTrace) 设置将由 getStackTrace() 返回,并由 printStackTrace() 和相关方法输出的堆栈跟踪元素。  
11 String toString() 返回此 throwable 的简短描述。 内部调用 

--> top



常见异常

图1 Error类的常见子类

图2 Exception类的常见子类

图3 RuntimeException类的常见的子类

--> top

时间: 2024-10-12 23:19:09

lang——Throwable子类的相关文章

java.lang.Throwable 异常/深入

有几个现象是需要总结的: -------------------------------------- 在java语言中,错误类的基类是java.lang.Error,异常类的基类是java.lang.Exception. 相同点:java.lang.Error和java.lang.Exception都是java.lang.Throwable的子类,因此java.lang.Error和java.lang.Exception自身及其子类都可以作为throw的使用对象,如:throw new MyE

sqoop报错java.lang.Throwable Message: ERROR: schema "jice" does not exist

---恢复内容开始--- Caused by: Exception: java.lang.Throwable Message: ERROR: schema "jice" does not exist 位置:35Stack trace: at org.postgresql.core.v3.QueryExecutorImpl (QueryExecutorImpl.java:2102) at org.postgresql.core.v3.QueryExecutorImpl (QueryExe

Android 使用Webview时,有时抛 java.lang.Throwable: EventHub.removeMessages(int what = 107) warning

在网上搜了大半天,也没能找到出现该警告的确切原因.通过测试发现,如果不加载url就不会出现该警告.突然间有个想法,莫非是跟页面中的html代码有关? 可是,页面是个静态html 页面,只包含几行最基本的代码呀!后来测试加载其他的页面,问题依久重现.可见出现异常的原因跟html页面没有关系,等回头有时间了 再仔细研究一下,问题先放在这吧..... public View onCreateView(android.view.LayoutInflater inflater, android.view.

android cordova java.lang.Throwable: EventHub.removeMessages(int what = 107) is not supported before the WebViewCore is set up问题的解决和想法

关于这个异常java.lang.Throwable: EventHub.removeMessages(int what = 107) is not supported before the WebViewCore is set up. 在项目中出现了好多次,但是,也不影响应用.可是不解决看着也闹心啊. 分析了下有可能是@Override onPageStarted方法引起的,也就是this.appView.loadUrl(url);后,还没有执行完,就去执行onPageStarted,导致的这个

【Android】java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'.

一.问题 Java调用JS事件出现 java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {3474c308} called on Looper (JavaBridg

Java-异常Throwable,Exception,Error

  异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程. Java通过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共

Throwable、Error、Exception、RuntimeException 区别 联系

转载 https://blog.csdn.net/liuj2511981/article/details/8524418 概要: 1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题.大多数这样的错误都是异常条件.虽然 ThreadDeath 错误是一个"正规"的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕

java.lang.NoSuchMethodError: org.springframework.dao.IncorrectResultSizeDataAccessException

spring data jpa  运用,在dao类中写自己新增的方法,使用@query写hql语句,出现以下异常: Caused by: java.lang.NoSuchMethodError: org.springframework.dao.IncorrectResultSizeDataAccessException.<init>(Ljava/lang/String;ILjava/lang/Throwable;)V at org.springframework.orm.jpa.EntityM

Throwable中的fillInStackTrace

fillInStackTrace 方法的作用就是一追可以追溯到栈的底部. 转载一个测试类: <span style="font-family:Microsoft YaHei;font-size:14px;">package com.exception; /** * Created with IntelliJ IDEA. * User: 菜鸟大明 * Date: 14-7-7 * Time: 下午10:42 * To change this template use File