如何理解java.lang.Throwable
2015-02-26 17:08
162 查看
首先,我们看jdk对Throwable类的介绍:java.lang.Throwable类是java中的所有错误和异常的超类,只有这个类或者这个类的子类才能够被jvm或者java的throw或throws子句所抛出,同时也只有该类或者他的一个子类才能作为catch子句的参数。
也就是说能够被throw(在方法中使用)和throws(在方法定义时使用)子句抛出以及被catch子句接住的玩意都是Throwable类或者其子类。
按照Throwable的分支,我们可以将java程序会出现的一些消极的问题分为错误和异常,分别是Error类和Exception类,具体的一些错误和异常都是这两个类的子类,其中Error表示系统级别的一些错误,通常来说是jvm发生了错误,当然这些错误可能是由应用程序本身的一些问题所引起的,典型常见的Error就是OutOfMemoryError, StackOverflowError,是JVM的错误,但是却是由于应用本身不够严谨的编码引起。而Exception表示应用程序本身的一些异常,是由于程序编写过程中,由于逻辑不严密等等程序员自身问题所造成的异常。
而Exception又可以分成两条线,分别是编译期异常和运行期异常,运行期异常就是RuntimeException以及其子类,而编译期异常则是Exception类以及其子类中的非RuntimeException及其子类。编译期异常和运行期异常之间的直接区别就是,编译期异常通常都是一些可以预见的异常,是编译期间能够检测的异常,比如ClassNotFoundException,编译器要求程序员必须对这种异常发生的情况进行处理。所以在程序编译期间,会强制程序员对编译期异常进行处理(catch或者throw),而对于运行期异常(典型的就是NullPointerException),因为这种异常在编译期无法检测,所以在编译期间不会强制对这种异常进行处理,而这种异常会在程序运行期间抛出,一旦jvm抛出了这种异常,会引起程序的异常中断。
而Error与RuntimeException类似,是运行期错误,是无法检测的,一旦发生会引起程序异常中断。
对于Error与RuntimeException可以通过catch子句进行捕获。
说了这么多,如果还不明白的话就上代码了。
也就是说能够被throw(在方法中使用)和throws(在方法定义时使用)子句抛出以及被catch子句接住的玩意都是Throwable类或者其子类。
按照Throwable的分支,我们可以将java程序会出现的一些消极的问题分为错误和异常,分别是Error类和Exception类,具体的一些错误和异常都是这两个类的子类,其中Error表示系统级别的一些错误,通常来说是jvm发生了错误,当然这些错误可能是由应用程序本身的一些问题所引起的,典型常见的Error就是OutOfMemoryError, StackOverflowError,是JVM的错误,但是却是由于应用本身不够严谨的编码引起。而Exception表示应用程序本身的一些异常,是由于程序编写过程中,由于逻辑不严密等等程序员自身问题所造成的异常。
而Exception又可以分成两条线,分别是编译期异常和运行期异常,运行期异常就是RuntimeException以及其子类,而编译期异常则是Exception类以及其子类中的非RuntimeException及其子类。编译期异常和运行期异常之间的直接区别就是,编译期异常通常都是一些可以预见的异常,是编译期间能够检测的异常,比如ClassNotFoundException,编译器要求程序员必须对这种异常发生的情况进行处理。所以在程序编译期间,会强制程序员对编译期异常进行处理(catch或者throw),而对于运行期异常(典型的就是NullPointerException),因为这种异常在编译期无法检测,所以在编译期间不会强制对这种异常进行处理,而这种异常会在程序运行期间抛出,一旦jvm抛出了这种异常,会引起程序的异常中断。
而Error与RuntimeException类似,是运行期错误,是无法检测的,一旦发生会引起程序异常中断。
对于Error与RuntimeException可以通过catch子句进行捕获。
说了这么多,如果还不明白的话就上代码了。
package expert.in.java.lang; public class ThrowableDemo { public static void main(String[] args){ ThrowableDemo et = new ThrowableDemo(); //第一节 //对于抛出的编译期异常,调用者被强制处理,否则无法通过编译 try { et.throwAExction(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //第二节 //对于抛出的运行期错误和运行期异常,调用者可以什么都不用做,会留下 //潜在的隐患,因此方法定义时throws子句抛出Error以及RuntimeException没有任何 //作用,而方法中的throw子句抛出的运行期错误和异常如果不做捕获处理,会导致 //程序异常中断 et.throwAError(); et.throwARuntimeException(); //第三节 //对于可能出现的运行期错误或异常,可以通过catch子句进行捕获,捕获后 //可以处理错误,来防止程序出现异常中断,如果目的是抛出让调用者来处理,如果 //抛出Error或RuntimeException //那么没有任何作用,由于编译期不会强制对运行期错误或异常进行处理,因此 //下面两个方法的中的处理方式毫无意义,并且会留下隐患,导致程序不够健壮 //不属于正确的处理方式,描述和上面两个方法相同 et.catchError(); et.catchRuntimeException(); //第四节 //如果捕获了运行期错误和异常,想让调用者来处理,可以将运行期错误和异常包装 //成为编译期异常抛出,这样程序就会在编译期强制调用者进行异常处理,避免程序 //由于运行期错误和异常而中断,因此而留下潜在的隐患 try { et.catchRuntimeThrowable(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 抛出编译期异常 * @throws Exception */ public void throwAExction() throws Exception{ throw new Exception(); } /** * 抛出运行期错误 * @throws Error */ public void throwAError() throws Error{ throw new Error(); } /** * 抛出运行期异常 * @throws RuntimeException */ public void throwARuntimeException() throws RuntimeException{ throw new RuntimeException(); } /** * 捕获Error并且抛出 * @throws Error */ public void catchError() throws Error{ try{ throwAError(); }catch(Error e){ //处理错误e或者将错误抛出 throw e; } } /** * 捕获RuntimeException并抛出 * @throws RuntimeException */ public void catchRuntimeException() throws RuntimeException{ try{ throwARuntimeException(); }catch(RuntimeException e){ //处理错误e或者将错误抛出 throw e; } } /** * 捕获运行期异常,包装成为编译期异常抛出,让调用者处理 * @throws Exception */ public void catchRuntimeThrowable() throws Exception{ try{ throwAError(); throwARuntimeException(); }catch(Error e){ throw new Exception(e); }catch(RuntimeException e){ throw new Exception(e); } } }
相关文章推荐
- 【java.lang】〖Runtime〗如何正确地应用Runtime类调用程序
- 简单理解java.lang.IllegalStateException异常:简单分析和简单解决方案
- java.lang.reflect.UndeclaredThrowableException原因和解决方法
- 如何理解和使用Java package包
- Java如何理解接口,写得好!
- 如何理解JAVA中的流概念
- java面向对象思想如何理解
- 简单理解java.lang.IllegalStateException异常
- JAVA基础(异常/深入java.lang.Throwable)
- 如何解决在快速向jtable添加数据的时候报AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:异常
- 如何理解JavaScript、Java、Jsp、J2ee之间的关系与区别
- JAVA基础(异常/深入java.lang.Throwable)
- 简单理解java.lang.IllegalStateException异常:简单分析和简单解决方案
- Exception in thread "main" java.lang.NoClassDefFoundError:错误 如何解决?
- 如何解决J2ME开发中遇到提示 ALERT: java/lang/ClassFormatError: Bad version information.的问题
- java.lang.Throwable and its descendant: Error and Exception
- 如何快速理解其他人写的Java代码
- 如何理解JAVA 参数传递总是值传递(pass-by-value )
- 如何理解JavaScript、Java、Jsp、J2ee之间的关系与区别
- 如何理解Java是跨平台的语言