Java中Exception的种类

通常来讲,Java中的异常会被分为三种:

  1. Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身。
  2. Runtime Exception: 运行时异常往往与环境有关,编译时无法检查,并且可能发生的情况太广泛,所以系统会去处理,程序不需要捕获。
  3. 普通异常: 常见的异常大多属于此类。

这里的Java异常指直接继承java.lang.Throwable的异常类,他们的结构如下图:

  • java.lang.Throwable
    • java.lang.Error
    • java.lang.Exception
      • java.lang.RuntimeException

java.lang.Throwable

java.lang.Throwable是Java中所有可以错误和异常的父类。这里设计成父类而不是接口,我想部分原因可能是在Java诞生的早期,使用类继承结构更为流行。但更重要的原因应该是由于Exception不适于设计为接口。接口重视的是实现方法,规则的描述,而Exception重视的是里面含有的信息以及类名等信息。

Throwable的子类一般含有两个构造函数:空参数的构造函数和带异常信息String参数的构造函数。如果此类继承自其它Exception类,又会多两个构造函数:含Throwable参数的构造函数和含Throwable,描述信息String两个参数的构造函数。

java.lang.Error

java.lang.Error发生在应用程序不应该试图捕获的情况。Java程序不需要去throw或catch此类及其子类,因为这种异常不应该由应用程序处理,并且通常属于abnormal的情况。

java.lang.Exception

java.lang.Exception是指Java程序应该捕获的异常。其中,java.lang.RuntimeException是其中一个特别的子类。

java.lang.RuntimeException

Java程序应该捕获,却可以不去捕获的一个异常。在大多数情况下,都不会去捕获他,一个重要原因是这种异常可能发生的情况太普遍,几乎每行代码都会有RuntimeException的风险,因此反而无需去捕获了。JDK文档中的原话是:“ A method is not required to declare in its  throws  clause any subclasses of  RuntimeException  that might be thrown during the execution of the method but not caught.

Throwable 是所有 Java 程序中错误处理的父类 ,有两种资类: Error 和 Exception 。
Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。
Exception :表示可恢复的例外,这是可捕捉到的。
Java 提供了两类主要的异常 :runtime exception 和 checked exception 。 checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。

但是另外一种异常: runtime exception ,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 RuntimeException可以说见的最多了,下面我们说明一下常见的RuntimeException: NullPointerException:见的最多了,其实很简单,一般都是在null对象上调用方法了。
ArrayIndexOutOfBoundsException:数组越界比如 int[] a=new int[3]; int b=a[3]; 
ClassCastException:类型转换错误比如 Object obj=new Object(); String s=(String)obj; 
出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run() 抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是 
Exception 的子类,也有一般异常的特点,是可以被 Catch 
块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 
在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常 
,或者是通过对异常的处理显式的控制程序退出。

异常处理的目标之一就是为了把程序从异常中恢复出来 。
java.lang.RuntimeException的直接子类有这些:

  1. AnnotationTypeMismatchException
  2. ArithmeticException
  3. ArrayStoreException
  4. BufferOverflowException
  5. BufferUnderflowException
  6. CannotRedoException
  7. CannotUndoException
  8. ClassCastException
  9. CMMException
  10. ConcurrentModificationException
  11. DataBindingException
  12. DOMException
  13. EmptyStackException
  14. EnumConstantNotPresentException
  15. EventException
  16. IllegalArgumentException
  17. IllegalMonitorStateException
  18. IllegalPathStateException
  19. IllegalStateException
  20. ImagingOpException
  21. IncompleteAnnotationException
  22. IndexOutOfBoundsException
  23. JMRuntimeException
  24. LSException
  25. MalformedParameterizedTypeException
  26. MirroredTypeException
  27. MirroredTypesException
  28. MissingResourceException
  29. NegativeArraySizeException
  30. NoSuchElementException
  31. NoSuchMechanismException
  32. NullPointerException
  33. ProfileDataException
  34. ProviderException
  35. RasterFormatException
  36. RejectedExecutionException
  37. SecurityException
  38. SystemException
  39. TypeConstraintException
  40. TypeNotPresentException
  41. UndeclaredThrowableException
  42. UnknownAnnotationValueException
  43. UnknownElementException
  44. UnknownTypeException
  45. UnmodifiableSetException
  46. UnsupportedOperationException
  47. WebServiceException

类设计时使用Exception的几个最佳实践(读Effective Java有感)

在Effective Java的Item 58中,Java Exception被分为三类:Error,checked exception和runtime exception。在设计类时,这三种Exception这样使用为佳:
  1. Error:用于JVM相关的错误,例如resource deficiences,invariant failures以及其他使JVM无法正常运行的异常。
  2. Runtime Exception:用于编程错误,JDK自带的很多就是用于编程错误
  3. Checked Exception:用于可以恢复的异常。
由于Error通常用于JVM相关的错误,因此其他的unchecked exception都应该继承自Runtime Exception
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值