系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、Error
- 二、Exception
- 2.1 AclNotFoundException
- 2.2 ActivationException
- 2.3 AlreadyBoundException
- 2.4 AWTException
- 2.5 BackingStoreException
- 2.6 BrokenBarrierException
- 2.7 CloneNotSupportedException
- 2.8 DataFormatException
- 2.9 ExecutionException
- 2.10 FontFormatException
- 2.11 GeneralSecurityException
- 2.12 IllegalClassFormatException
- 2.13 InterruptedException
- 2.14 IntrospectionException
- 2.15 InvalidPreferencesFormatException
- 2.16 IOException
- 2.17 LambdaConversionException
- 2.18 LastOwnerException
- 2.19 MimeTypeParseException
- 2.20 NoninvertibleTransformException
- 2.21 NotBoundException
- 2.22 NotOwnerException
- 2.23 ParseException
- 2.24 PrinterException
- 2.25 PrivilegedActionException
- 2.26 PropertyVetoException
- 2.27 ReflectiveOperationException
- 2.28 RuntimeException
- 2.29 ServerNotActiveException
- 2.30 SQLException
- 2.31 TimeoutException
- 2.32 TooManyListenersException
- 2.33 UnmodifiableClassException
- 2.34 UnsupportedFlavorException
- 2.35 URISyntaxException
- 总结
前言
注:本文JDK版本为1.8
本文主要是对Java中的Throwable子类Error以及Exception做一个讲解,主要针对java.*包也就是JavaSE标准库来做一个讲解分析。如下图就是标准库中的异常架构图:
提示:以下是本篇文章正文内容,下面案例可供参考
一、Error
1.1 AnnotationFormatError
当注释解析器试图从类文件读取注释并确定该注释是畸形时抛出。这个错误可以由{@linkplain java.lang.reflect.AnnotatedElement API抛出,该API用于反射性地读取注释}。
在java.lang.reflect包下的Constructor(handleParameterNumberMismatch)和Method(getDefaultValue和handleParameterNumberMismatch)中可以看到使用
1.2 AssertionError
抛出,指示断言失败。
在java.*的包下可以看到多次使用,比如java.math的audit方法中:
1.3 AWTError
当发生严重的 Abstract(A) Window(W) Toolkit(T) 错误时,抛出此错误
在java.awt包下的Toolkit类的loadAssistiveTechnologies方法中可以看到多次使用,如下:
1.4 CoderMalfunctionError
当 CharsetDecoder 的 decode 方法,或 CharsetEncoder 的 encode 方法抛出不可预料的异常时抛出的错误,使用示例如下:
1.5 IOError
当发生严重的I/O错误时被抛出。
在java.io包下Console类的readPassword方法中可以看到多次使用,如下图所示:
1.6 LinkageError
LinkageError的子类表明一个类对另一个类有一些依赖;但是,后一个类在编译前一个类之后发生了不兼容的更改。
它有很多子类如下所示:
LinkageError (java.lang)
BootstrapMethodError (java.lang)
ClassCircularityError (java.lang)
ClassFormatError (java.lang)
GenericSignatureFormatError (java.lang.reflect)
UnsupportedClassVersionError (java.lang)
ExceptionInInitializerError (java.lang)
IncompatibleClassChangeError (java.lang)
AbstractMethodError (java.lang)
IllegalAccessError (java.lang)
InstantiationError (java.lang)
NoSuchFieldError (java.lang)
NoSuchMethodError (java.lang)
NoClassDefFoundError (java.lang)
UnsatisfiedLinkError (java.lang)
LibraryNotFoundError (org.apache.tomcat.jni)
VerifyError (java.lang)
比如在java.lang.invoke包下的MemberName类中的MemberName方法中可以看到:
1.7 ServiceConfigurationError
在查找,加载或实例化服务提供者时出现错误时抛出错误
如在java.nio.channels.spi包下的AsynchronousChannelProvider类中的loadProviderFromProperty方法中可以看到多次使用:
1.8 ThreadDeath
调用 Thread 类中带有零参数的 stop 方法时,受害线程将抛出一个 ThreadDeath 实例。仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例。如果 ThreadDeath 被一个方法捕获,那么将它重新抛出非常重要,因为这样才能让该线程真正终止。如果没有捕获 ThreadDeath,则顶级错误处理程序不会输出消息。虽然 ThreadDeath 类是“正常出现”的,但它只能是 Error 的子类而不是 Exception 的子类,因为许多应用程序捕获所有出现的 Exception,然后又将其放弃。
在 java.io的ObjectInputStream类中的方法readSerialData可以看到使用:
1.9 VirtualMachineError
抛出,表示Java虚拟机损坏或耗尽了继续操作所需的资源。它是 JVM 的一种自我防御机制,用于防止整个应用程序崩溃。它有多个子类如下所示:
InternalError (java.lang)
ZipError (java.util.zip)
OutOfMemoryError (java.lang)
OutOfDirectMemoryError (io.netty.util.internal)
OutOfDirectMemoryError (io.netty.util.internal)
sprwpA (com.spire.barcode.packages)
StackOverflowError (java.lang)
UnknownError (java.lang)
其实看到这些子类很多人会很熟悉,尤其是OutOfMemoryError(内存溢出错误),具体的这里就不多说明了。
二、Exception
2.1 AclNotFoundException
每当引用不存在的ACL(访问控制列表)时,就会抛出此异常。此异常属于JAVA早期版本使用的异常,现在应该很少会出现。
2.2 ActivationException
激活接口所使用的一般异常。从版本 1.4 开始,已对此异常作出改进,以符合通用异常链机制。可在构造时提供并通过公共 detail 字段访问的“详细的异常”现在称为 cause,该异常也能通过 Throwable.getCause() 方法以及前述的“遗留字段”访问。在 ActivationException 的一个实例上调用方法 Throwable.initCause(Throwable) 总是抛出 IllegalStateException。
比如在java.rmi.activation包下的ActivationGroup类中的createGroup方法可以看到多处使用:
2.3 AlreadyBoundException
如果试图将注册表中的对象绑定到已具有相关绑定的名称上,则抛出 AlreadyBoundException。
在java.rmi包下的Naming类中的bind方法可以看到使用:
2.4 AWTException
当出现 Abstract(A) Window(W) Toolkit(T) 异常时,抛出此异常。
在java.awt包下的Cursor类中的getSystemCustomCursor方法可以看到多处使用:
2.5 BackingStoreException
抛出以表示由于后备存储中的故障而无法完成首选项操作,或无法联系后备存储
在java.util.prefs包下的AbstractPreferences类中的removeNode2方法中可以看到使用:
2.6 BrokenBarrierException
当某个线程试图等待处于断开状态的 barrier 时,或者 barrier 进入断开状态而线程处于等待状态时,抛出该异常。
在java.util.concurrent包下的 CyclicBarrier 类的 dowait 方法中可以看到使用:
2.7 CloneNotSupportedException
抛出以表示类Object中的clone方法已被调用来克隆一个对象,但该对象的类没有实现Cloneable接口。覆盖clone方法的应用程序也可以抛出此异常,以表明对象不能或不应该被克隆。
在 java.lang包下的Thread类中的clone方法可以看到使用:
2.8 DataFormatException
表示发生了数据格式错误。
在java.util.zip包下的 InflaterInputStream 类中的 read 方法可以看到使用:
2.9 ExecutionException
尝试检索通过抛出异常而中止的任务的结果时抛出异常。 可以使用Throwable.getCause()方法检查此异常。
在java.util.concurrent包下的CompletableFuture类中的reportGet方法可以看到使用:
2.10 FontFormatException
在 Font类中通过 Font方法抛出,以指示指定的字体是坏的。
在java.awt包下的Font类中的createFont方法可以看到使用;
2.11 GeneralSecurityException
GeneralSecurityException类是一种通用的安全性异常类,它为所有与安全相关的异常类提供类型安全性。
在java.security包下的Signature类中的getInstanceRSA方法可以看到使用:
2.12 IllegalClassFormatException
当其输入参数无效时,通过ClassFileTransformer.transform的实现抛出。这可能是因为初始类文件字节无效或先前应用的转换损坏了字节。
在java.lang.instrument包下的 ClassFileTransformer接口中的transform方法可以看到使用
2.13 InterruptedException
线程在等待,睡眠或以其他方式占用时抛出,线程在活动之前或活动期间中断。偶尔,一个方法可能希望测试当前线程是否已被中断,如果是,立即抛出该异常。可以使用以下代码来实现这一效果:
if (Thread.interrupted()) // Clears interrupted status!
throw new InterruptedException();
在java.lang包下的 ProcessImpl类中的 waitFor 方法可以看到使用
2.14 IntrospectionException
内省时发生异常时抛出。
典型的原因包括无法将字符串类名称映射到Class对象,无法解析字符串方法名称,或指定其预期用途具有错误类型签名的方法名称。
在java.beans包下的EventSetDescriptor类中的EventSetDescriptor方法可以看到使用
2.15 InvalidPreferencesFormatException
抛出,表明操作无法完成,因为输入不符合相应的XML文档类型,偏好的集合,如按照Preferences规范。
在java.util.prefs包下的XmlSupport类中的importMap方法可以看到使用
2.16 IOException
表示发生某种类型的I / O异常。此类是由失败或中断的I / O操作产生的一般异常类。经常能见到的一种异常。
如在java.io包下的PrintStream类中的ensureOpen方法可以看到使用
2.17 LambdaConversionException
Lambda转换异常
比如在java.lang.invoke包下的AbstractValidatingLambdaMetafactory类中的AbstractValidatingLambdaMetafactory方法可以看到使用
2.18 LastOwnerException
这是在尝试删除访问控制列表的最后一个所有者时抛出的异常。
在com.sun.jmx.snmp.IPAcl包下的OwnerImpl类中deleteOwner方法可以看到使用
2.19 MimeTypeParseException
封装MimeType解析相关异常的类
在java.awt.datatransfer包下的MimeType类中的MimeType方法可以看到使用
2.20 NoninvertibleTransformException
所述NoninvertibleTransformException类表示如果进行的操作,要求一个的逆时引发一个例外AffineTransform对象但AffineTransform处于非可逆状态。
在java.awt.geom包下的AffineTransform类中的createInverse方法可以看到使用
2.21 NotBoundException
一个 NotBoundException如果试图查找或在注册表解绑没有相关绑定的名字被抛出。
在java.rmi包下的Naming类中的lookup方法可以看到
2.22 NotOwnerException
这是一个异常,只要对象(如访问控制列表)的修改只允许由对象的所有者完成,但是尝试修改的Principal不是所有者。
在java.security.acl包下的Acl接口的setName方法可以看到使用
2.23 ParseException
表示解析时意外出现错误。
可以看到多处使用,比如在java.text包下的DateFormat类中的parse方法可以看到
2.24 PrinterException
PrinterException类及其 PrinterException类用于指示在打印系统中发生异常情况。
在java.awt.print包下的PrinterJob类中的setPrintService方法可以看到使用
2.25 PrivilegedActionException
这个异常被doPrivileged(PrivilegedExceptionAction)和doPrivileged(PrivilegedExceptionAction, AccessControlContext context)抛出,表示正在执行的动作抛出一个被检查的异常。可以通过调用getException方法获取操作抛出的异常。实际上, PrivilegedActionException是特权操作抛出的异常的“包装器”。
从版本1.4开始,这种异常已被改进以符合通用异常链接机制。 在建造时提供的“通过特权计算抛出的异常”是通过getException()方法访问的,现在被称为原因 ,并且可以通过Throwable.getCause()方法以及上述“传统方法”来访问。
在java.util包下的Calendar类中的readObject方法可以看到使用
2.26 PropertyVetoException
当对属性的建议更改表示不可接受的值时,将抛出PropertyVetoException。
在java.beans.beancontext包下的BeanContextChildSupport类中的setBeanContext方法可以看到使用
2.27 ReflectiveOperationException
核心反射中的反射操作所引起的异常的常见超类。
在java.lang.invoke包下的MemberName类中的makeAccessException方法可以看到使用
2.28 RuntimeException
RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些异常的超类。
RuntimeException及其子类是未经检查的异常 。 unchecked异常不需要在方法或构造函数的拟申报throws条款,如果他们可以通过该方法或构造函数的执行被抛出和方法或构造边界之外传播。
在java.util.concurrent.atomic包下的AtomicIntegerFieldUpdaterImpl类中的AtomicIntegerFieldUpdaterImpl方法可以看到使用
2.29 ServerNotActiveException
一个 ServerNotActiveException是 异常到在呼叫期间抛出 RemoteServer.getClientHost如果getClientHost方法,称为服务远程方法调用的外部。
在java.rmi.server包下的RemoteServer类中的getClientHost方法可以看到使用
2.30 SQLException
提供有关数据库访问错误或其他错误的信息的异常。
每个SQLException提供了几种信息:
- 描述错误的字符串。 这被用作Java异常消息,通过方法getMesasge 。
- 一个“SQLstate”字符串,它遵循XOPEN SQLstate约定或SQL:2003约定。 SQLState字符串的值在相应的规范中描述。
- DatabaseMetaData方法getSQLStateType可用于发现驱动程序是否返回XOPEN类型或SQL:2003类型。
- 一个特定于每个供应商的整数错误代码。 通常这将是底层数据库返回的实际错误代码。
- 连锁到下一个例外。 这可以用于提供其他错误信息。
- 因果关系,如果有的话这个SQLException 。
在java.sql包下的DriverManager类中的getDriver方法中可以看到使用
2.31 TimeoutException
阻塞操作超时时抛出异常。指定超时的阻止操作需要一种表示超时发生的方法。对于许多这样的操作,可以返回一个指示超时的值;当不可能或不可取的时候,应该声明和抛出TimeoutException 。
在java.util.concurrent包下的CompletableFuture类中的timedGet方法可以看到使用
2.32 TooManyListenersException
TooManyListenersException异常用作Java事件模型的一部分,用于注释和实现组播事件源的单播特殊情况。
在通常的多播“void addXyzEventListener”事件侦听器注册模式的任何给定具体实现中存在“throws TooManyListenersException”子句用于将该接口注释为实现单播侦听器特殊情况,即,该唯一的一个侦听器可能同时在特定事件侦听器源上注册。
在java.awt.dnd包下的DragGestureRecognizer类中的addDragGestureListener方法可以看到使用
2.33 UnmodifiableClassException
当一个指定的类不能被修改时被 Instrumentation.redefineClasses的 实现抛出。
在java.lang.instrument包下的Instrumentation接口中的retransformClasses方法可以看到使用
2.34 UnsupportedFlavorException
表示在此风格中不支持所请求的数据。
在java.awt.datatransfer包下的Clipboard类中的getData方法可以看到使用
2.35 URISyntaxException
检查的异常抛出以指示不能将字符串解析为URI引用。
在java.net包下的URI类中的checkPath方法可以看到使用
总结
本文主要是对JavaSE标准库的异常做了一个简答介绍,一些其他相关的后续再补充,笔者就先写到这里了哈哈。
著作权归NoLongerConfused所有。商业转载请联系NoLongerConfused获得授权,非商业转载请注明出处。