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

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 西安海思机试题是针对Java编程语言的一道考试题目。海思机试题通常要求考生能够熟练掌握Java语言的基本语法和常用类库,并能够运用这些知识解决简单的编程问题。 在机试题中,通常会涉及到一些基本的编程概念,如变量、循环、条件判断、函数等。考生需要使用Java语言来实现特定的功能或逻辑,并输出正确的结果。 对于西安海思机试题,可能会包含以下一些例子: 1. 写一个程序,输出从1到100的所有偶数。 解题思路:使用循环从1到100遍历,判断每个数字是否为偶数,如果是则输出。 2. 写一个程序,求一个数组中的最大值和最小值。 解题思路:使用循环遍历数组中的每个元素,通过比较更新最大值和最小值。 3. 写一个程序,判断一个字符串是否是回文字符串。 解题思路:使用循环将字符串反转,并与原字符串进行比较,如果相同则是回文字符串。 对于这些机试题,考生应该具备良好的编程思维和逻辑分析能力,善于利用Java语言特性和类库来解决问题。此外,高效的编码能力和代码风格的优化也是考生需要具备的能力。 要准备西安海思机试题,考生可以通过复习Java基本语法、数据类型、循环、条件判断和函数等知识,并通过编写代码实践来提升自己的编程技巧。还可以参考一些教材、教程或者在线编程平台上的题库进行练习和加深理解。 最后,机试题不仅仅是一次考试,更重要的是通过实践来提升自己的编程能力和解决问题的能力。希望以上回答对你有所帮助。 ### 回答2: 西安海思机试题是一道关于Java的题目。Java是一种常见的高级编程语言,具有跨平台的特性,可以用于开发各种类型的软件应用程序。机试题通常用来测试考生在编程领域的技能和知识。 对于这样的机试题,可能会包括一系列的编程题目,考察考生的语法知识、算法和逻辑思维能力等方面。在解答机试题时,需要考生清晰理解题目的要求,并用合适的Java代码进行解答。 解答机试题的关键在于理解题目要求,并用合适的算法和Java编程语言来实现解决方案。在解答过程中,还需要注意代码的规范性、可读性和效率。 对于想要参加西安海思机试的考生,建议他们提前准备,复习并熟悉Java编程语言的基础知识和常见的算法。此外,也可以通过练习机试题,提高自己的解决问题和编程能力。 总之,西安海思机试题-java是一种考察考生Java编程能力和知识技能的方式。参加机试需要考生具备扎实的编程基础和算法思维,同时也需要平时勤加练习和积累,提高自己在编程领域的能力。 ### 回答3: 西安海思机试题是一个关于Java编程的考试题目。在这个机试题中,考生需要完成一些与Java语言相关的编程任务,以展示自己的编程能力。根据题目的要求,考生可能需要使用Java编程语言来实现一些功能,如算法设计、数据结构操作等。 在西安海思机试题中,考生需要具备扎实的Java编程基础以及良好的逻辑思维能力。他们需要理解题目要求,分析问题,并设计出合适的解决方案。在编程过程中,考生需要熟练运用Java的各种语法、类库和工具,以便高效地完成任务。此外,考生还需要注意代码的可读性和可维护性,以便其他程序员理解并维护他们的代码。 西安海思机试题涉及的内容可能包括但不限于以下几个方面: 1. Java基础知识:如基本语法、面向对象编程概念、异常处理、输入输出等。 2. 数据结构与算法:如链表、栈、队列、排序算法等。 3. 多线程编程:如线程创建与启动、同步与互斥、线程池等。 4. 网络编程:如TCP/IP通信、Socket编程等。 5. 数据库操作:如JDBC编程、SQL语句执行等。 在准备西安海思机试题时,考生可以通过以下途径提升自己的编程能力: 1. 学习和掌握Java编程语言的基础知识,包括语法、集合框架、IO操作等。 2. 多进行编程练习,不断提高自己的编码能力。 3. 阅读与Java相关的书籍、文章以及开源项目,学习他人的经验和优秀的编码风格。 4. 加入编程社区或者论坛,与其他程序员交流经验。 5. 参加在线教育平台或培训机构的Java课程,接受系统的培训。 总之,参加西安海思机试题是提升自己Java编程能力的一个很好的机会。通过扎实的基础知识和充分的准备,考生可以在这个机试中展现出自己的编程实力。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoLongerConfused

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值