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.”

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java异常Exception)是指在程序执行过程出现的意外情况或错误。Java异常分为两种主要类型:受检异常(checked exceptions)和非受检异常(unchecked exceptions)。 1. 受检异常(Checked Exceptions): 受检异常是指在代码必须显式处理的异常,即在方法签名的throws子句声明或使用try-catch语句进行捕获和处理。受检异常一般表示外部环境或资源的错误或不可用性,以及需要调用者进行处理或决策的其他条件。例如,IOException、SQLException等都是受检异常。如果一个方法抛出受检异常,调用者必须在代码显式地处理该异常。 2. 非受检异常(Unchecked Exceptions): 非受检异常是指不需要在方法签名声明或捕获的异常,也就是说,编译器不会强制要求处理这类异常。非受检异常通常表示程序内部逻辑错误或运行时错误,例如NullPointerException、ArrayIndexOutOfBoundsException等。这些异常通常是由程序员编写的代码错误引起的,需要通过调试和修复代码来解决。 此外,还有一个特殊类型的非受检异常,即错误(Error)。错误表示JVM或系统级别的严重问题,例如内存溢出(OutOfMemoryError)或栈溢出(StackOverflowError)。与普通的非受检异常不同,错误一般不应该被捕获或处理,而是应该由虚拟机来处理。 总结: Java异常可以分为受检异常和非受检异常。受检异常需要在代码显式处理,而非受检异常不需要。受检异常通常表示外部环境或资源的错误或不可用性,而非受检异常通常表示程序内部逻辑错误或运行时错误。同时,还有一种特殊的非受检异常,即错误,表示JVM或系统级别的严重问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值