写点什么

Java 基础系列文章 --- 异常

  • 2022 年 3 月 11 日
  • 本文字数:5694 字

    阅读完需:约 19 分钟

Java基础系列文章---异常

系列文章目录


前言

注:本文 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 获得授权,非商业转载请注明出处。

发布于: 刚刚阅读数: 2
用户头像

相信奇迹的人本身就和奇迹一样了不起。 2022.01.05 加入

每个人,都可以因为读了一本书,或者一段经历,生活开始有了一些不一样。

评论

发布
暂无评论
Java基础系列文章---异常_3 月月更_NoLongerConfused_InfoQ写作平台