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 MyError();和throw new MyException();其中,MyError类是java.lang.Error的子类,MyException类是java.lang.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的子类。

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

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

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

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

JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对象,它封装了异常信息,java异常的根类为java.lang.Throwable,整个类有两个直接子类java.lang.Error和java.lang.Exception.Error是程序本身无法恢复的严重错误.Exception则表示可以被程序捕获并处理的异常错误.JVM用方法调用栈来跟踪每个线程中一系列的方法调用过程,该栈保存了每个调用方法的本地信息.对于独立的JAVA程序,可以一直到该程序的main方法.当一个新方法被调用的时候,JVM把描述该方法的栈结构置入栈顶,位于栈顶的方法为正确执行的方法.当一个JAVA方法正常执行完毕,JVM回从调用栈中弹处该方法的栈结构,然后继续处理前一个方法.如果java方法在执行代码的过程中抛出异常,JVM必须找到能捕获异常的catch块代码.它首先查看当前方法是否贼这样的catch代码块,如果存在就执行该catch代码块,否则JVM回调用栈中弹处该方法的栈结构,继续到前一个方法中查找合适的catch代码块.最后如果JVM向上追到了main()方法,也就是一直把异常抛给了main()方法,仍然没有找到该异常处理的代码块,该线程就会异常终止,如果该线程是主线程,应用程序也随之终止,此时JVM将把异常直接抛给用户,在用户终端上会看到原始的异常信息.

本文转自:http://nakata-yf.iteye.com/blog/23569

时间: 2024-08-26 12:21:40

java.lang.Throwable 异常/深入的相关文章

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,导致的这个

sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class异常解决方法

package com.wzs; import java.lang.reflect.ParameterizedType; public class T1<T> {     private Class classt;     public T1() {         ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();         this.classt = (Class)

多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常

package com.bjsxt.d822.a2; public class SubThread9 extends Thread { /* * 当多个对象同时对同一个资源操作,则必须使用同步机制来控制. * * 1.当方法去操作共享资源时,则该方法必须通过 synchronized关键字来修饰. * 2.当方法被 synchronized 关键字修饰时,还需要 wait() 和 notify()两个方法配合使用. * wait()方法是让当前线程对象进入等待状态. * notify()方法是让

getActionBar().setTitle(); Java.lang.NullPoint异常解决方案

getActionBar().setTitle(); Java.lang.NullPoint异常解决方案,是由于低版本不支持直接获取的缘故,修改方案: try changing your theme to this <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> and not the AppCompat Version 另外一种情况,如果是低版本,API低于

java.lang.IllegalThreadStateException异常原因解析——同一个线程不能重复调用start方法

前几天写了个小程序,运行的时候发现在循环第二遍的时候出现了java.lang.IllegalThreadStateException异常通过上网查询发现同一个Thread不能重复调用start方法,做如下修改就好了:将自己定义的SellTicket extends Thread 线程类改成SellTicket implements Runnable,后用new Thread(robot).start 就可以启动多次了

Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法

使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 1 ActionContext context = ActionContext.getContext(); 2 ServletContext servletContext = (ServletContext) context.get(ServletActionContext.SERVLET_CONTEXT); //抛空指针异常

android eclipse调试报java.lang.ClassCastException异常

在布局文件中 ImageView 位置第一次先放在Button之前 编译代码没有出错 然后调整两者的位置 再次编译 报如下错误 异常提示Button类型不能转换成ImageView类型 为什么会这么报错呢,我明明没有让它们之间进行转换. 原来由于eclipse的编译是基于时间戳的判断机制的.所以当你按build all的时候有些eclipse认为时间戳没有改变的类不会被编译.因此你可以先clean一下再编译.这个时候eclipse会将所有的以前编译信息清除然后编译. 在调换两个控件的前后位置再次

sqoop报错java.lang.Throwable Message: ERROR: schema &quot;jice&quot; 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