,,Java 常见异常(Runtime Exception )详细介绍并总结

,,Java 常见异常(Runtime Exception )详细介绍并总结

本文主要介绍常见的Java运行时异常及相关资料。大家在开发Java应用软件的时候经常会遇到各种各样的异常。在这里,我帮你整理其中的一些,并说明如何解决。有需要的朋友可以参考一下。

本文重点介绍Java中异常机制的一些概念。写这篇文章的目的是为了方便我在很久以后忘记这些事情的时候,能够快速的回忆起来。

1. 异常机制

1.1异常机制是指当程序出现错误时,程序如何处理。具体来说,异常机制为程序退出提供了一个安全通道。当出现错误时,程序执行的过程发生变化,程序的控制权转移到异常处理程序。

1.2传统的处理异常的方式是函数返回一个特殊结果来表示异常的发生(通常这个特殊结果是大家约定俗成的),调用函数的程序负责检查和分析函数返回的结果。这样做有以下缺点:比如函数返回-1,说明发生了异常,但如果函数真的想返回-1的正确值,就会出现混乱;降低可读性,把程序代码和处理异常的代码混在一起;错误由调用函数的程序进行分析,这就要求客户端程序员对库函数有很深的理解。

1.3异常处理流程

1.3.1遇到错误时,方法立即结束,不返回值;同时,抛出一个异常对象

1.3.2调用此方法的程序不会继续执行,而是会搜索一个可以处理异常的异常处理程序,并执行代码。

2 异常的分类

2.1异常的分类

2.1.1异常继承结构:基类是Throwable,错误和异常继承Throwable,RuntimeException和IOException继承Exception,具体的RuntimeException继承RuntimeException。

2.1.2 Error和RuntimeException及其子类成为未检查异常,其他异常成为检查异常。

2.2每种异常的特征

2.2.1错误系统错误类系统描述了Java运行系统中的内部错误和资源耗尽。应用程序不应该抛出这种类型的对象(通常由虚拟机抛出)。如果出现这种错误,除了尽力让程序安全退出之外,别无他法。所以在编程的时候,要多关注异常系统。

2.2.2异常系统异常系统包括RuntimeException系统和其他非RuntimeException系统。

2.2.2.1的runtime exception runtime exception系统包括不正确的类型转换、数组越界访问和试图访问空指针等。处理RuntimeException的原则是:如果发生RuntimeException,一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。

其他异常如2.2.2.2(io exception等。)一般都是外部错误,比如试图从文件末尾读取数据。这不是程序本身的错误,而是应用环境的外部错误。

2.3不同于C异常分类

2.3.1其实Java中的RuntimeException这个名字并不合适,因为任何异常都是在运行时发生的。(编译时出现的错误不是异常,换句话说,异常是为了解决程序运行时出现的错误)。

2 . 3 . 2 c中的logic_error相当于Java中的RuntimeException,而runtime_error相当于Java中非RuntimeException类型的Exception。

3 异常的使用方法

3.1声明方法抛出异常。

3.1.1语法:throws(省略)

3.1.2为什么要声明方法抛出异常?方法是否抛出异常与方法返回值的类型一样重要。假设方法引发的异常没有声明该方法将引发异常,则客户端程序员可以调用此方法,而无需编写处理异常的代码。然后,一旦出现异常,没有合适的异常控制器来解决。

3.1.3抛出的异常为什么一定是被检查的异常?RuntimeException和Error可以在任何代码中生成。它们不需要程序员来扔。一旦出现错误,就会自动抛出相应的异常。检查异常由程序员抛出,分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);程序员自己通过使用throw语句抛出异常。遇到错误,程序员一般无能为力;当遇到RuntimeException时,一定是程序出现了逻辑错误,需要修改程序(相当于调试的一种方法);程序员只关心检查过的异常,程序应该只抛出或处理检查过的异常。

3.1.4注意:覆盖父类方法的子类方法不能抛出比父类方法更多的异常。所以有时候父类的方法在设计的时候会声明抛出异常,但是实际实现方法的代码并没有抛出异常。这样做的目的是方便子类方法在覆盖父类方法时抛出异常。

3.2 如何抛出异常

3.2.1语法:throw(略)

3.2.2抛出什么异常?对于一个异常对象,真正有用的信息是异常对象的类型,而异常对象本身是没有意义的。例如,如果异常对象的类型是ClassCastException,那么类名是唯一有用的信息。因此,在选择抛出什么异常时,最重要的是选择能清楚解释异常的异常的类名。

3.2.3异常对象通常有两种构造函数:一种是无参数构造函数;另一个是带字符串的构造函数,除了类型名之外,还会作为这个异常对象的附加描述。

3.2.4创建自己的异常:当Java内置的异常没有一个能明确解释异常时,就需要创建自己的异常。需要注意的是,唯一有用的信息是类型名,所以不要把精力花在异常类的设计上。

3.3 Catch exceptions如果一个异常没有被处理,那么,对于一个非图形界面的程序,程序将被挂起,并输出异常信息;对于一个图形界面程序,也会输出异常信息,但程序并不停止,而是返回用户界面处理循环。

3.3.1语法:try、catch和finally控制器模块必须紧跟在try块之后。如果抛出异常,异常控制机制会搜索第一个参数与异常类型匹配的控制器,然后进入catch子句,认为异常已经得到控制。一旦catch子句结束,对控制器的搜索也将停止。

在3.3.1.1中捕捉多个异常(注意语法和捕捉顺序)(略)

3.3.1.2的使用和异常处理流程(略)

3.3.2异常处理做什么?对于Java,由于垃圾收集,异常处理不需要回收内存。但是还是有一些资源是程序员需要收集的,比如文件,网络连接,图片。

3.3.3应该声明方法抛出异常还是在方法中捕捉异常?原则:捕捉并处理知道如何处理的异常,传递不知道如何处理的异常。

再次抛出一个异常

为什么3.3.4.1再次抛出异常?在这个级别中,只能处理部分内容,有些处理需要在更高级别的环境中进行,所以要再次抛出异常。这样,每个级别的异常处理程序都可以处理它能处理的异常。

3.3.4.2异常处理过程中同一个try块对应的catch块会被忽略,抛出的异常会进入更高一级。

4 关于异常的其他问题

4.1过度使用异常首先,使用异常很方便,所以程序员一般不再愿意写代码处理错误,而只是简单的抛出一个异常。这样做是错误的。对于完全已知的错误,我们应该编写代码来处理这样的错误,增加程序的健壮性。另外,异常机制的效率很差。

4.2区分例外和常见错误。对于常见的完全一致错误,应该编写代码来处理这种错误,增加程序的健壮性。只有无法确定和预测的外部运行时错误才需要使用异常。

4.3异常对象包含的信息一般来说,异常对象唯一有用的信息就是类型信息。但是在使用带有异常字符串的构造函数时,这个字符串也可以作为附加信息。调用异常对象的getMessage()、toString()或printStackTrace()方法,可以分别得到异常对象的附加信息、类名和调用栈的信息。后者包含的信息是前者的超集。

常用异常:

 UnsupportedOperationException不支持的操作

  IllegalArgumentException非法参数

  IndexOutOfBoundsException索引出界

非法状态

它不同于普通的警告等。当应用程序出现异常时,会中断正在执行的程序的正常指令流。也就是说,异常背后的代码不会被正确执行。甚至会触发数据库的回滚操作。

在Java开发平台中,异常包括预定义异常和自定义异常。这两种类型的异常相互补充。作为一名合格的程序开发人员,要善于在应用程序中使用异常。这可以提高应用程序的交互性。同时也是保证应用正常运行的前提。因此,异常处理对于开发一个优秀的应用程序非常重要。所以我认为程序开发人员应该对Java应用的常见异常有深刻的理解。只有了解了这些常见的异常,才能处理好自定义异常。

一、常见异常的类型与原因。

对于Java应用常见的异常,笔者认为程序开发人员应该从两个方面来理解。一是要知道常见的Java应用异常是什么,二是要知道可能导致这种异常的原因是什么。这不仅需要项目经理在日常工作中注意积累,必要时还需要从其他渠道收集数据。笔者对此进行了分析,希望对程序开发人员有所帮助。

1、 SQLException:操作数据库异常类。

如今,大多数Java应用程序都依赖于数据库。如果Java应用程序与数据库通信时出现错误,将触发该类。同时,数据库的错误信息也会通过这个类显示给用户。也就是说,这个操作数据库异常类是数据库和用户之间异常信息传递的桥梁。例如,当用户向系统中插入数据时,数据库中规定某个字段必须是唯一的。当用户插入数据时,如果该字段的值与现有记录重复,这违反了数据库的唯一性约束,那么数据库将运行出异常消息。普通用户可能看不到这些信息,因为它发生在数据库级别。此时,操作数据库异常类将捕获数据库的异常信息,并将其传递给前台。这样前台用户就可以根据这个异常信息分析错误的原因。这是这个操作数据库异常类的主要目的。在Java应用中,当所有数据库操作异常时,将触发该类。这时候所有Java应用本身的提示信息往往过于笼统,只说与数据库交互有错误,参考价值不大。相反,数据库的提示信息更有价值。

2、 ClassCastException:数据类型转换异常。

在Java应用程序中,有时需要转换数据类型。这种转化包括显性转化和隐性转化。但无论如何转换,都要满足一个前提条件,那就是数据类型的兼容性。如果在数据转换过程中违反了这个原则,就会触发数据类型转换的异常。例如,现在在应用程序中,开发人员需要将字符类型的日期数据转换为数据库可以接受的日期数据。这时候他们只需要在前台应用中控制一下,一般不会有问题。但如果前端应用缺乏相关控件,比如用户输入日期时,只输入了月日的信息,而没有输入年份的信息。此时,当应用程序执行数据类型转换时,将会出现异常。根据笔者的经验,数据类型转换异常是应用开发中比较常见的异常,也是比较低级的异常。因为在大多数情况下,您可以控制应用程序窗口中的数据类型。也就是说,在转换数据类型之前,数据类型的兼容性是有保证的。这样就不容易造成数据类型转换异常。例如,在只允许数字值的字段中,您可以设置不允许用户输入数字值以外的字符。虽然有异常处理机制,但是可以保证应用程序不会错误运行。但在实际开发中,还是要尽可能预见错误的原因,尽量避免异常的发生。

3、 NumberFormatException:字符串转换为数字类型时抛出的异常。

在数据类型转换的过程中,如果在字符型转换为数字型的过程中出现了问题,Java程序中会针对这个异常采用一个独立的异常NumberFormatException。例如,当字符类型数据“123456”转换为数字类型数据时,它是允许的。但是,如果字符数据包含非数字字符,如123#56,则在转换为数字时会出现异常。系统将捕捉并处理这个异常。

Java应用程序中有许多常见的异常类。比如找不到对应的类异常,有些类异常不允许访问,文件已经结束,找不到文件,找不到字段等等。一般系统开发人员可以根据这个异常名来判断当前异常的类型。很好,但是好记性不如烂笔。必要时(特别是当有用户定义的异常时),程序开发人员最终会有一个异常列表。这样无论是应用在调试过程中发现问题,还是在运行过程中收到用户的投诉,都可以根据异常的名称及时找出异常的原因。因此,可以在最短的时间内解决异常,并且可以恢复应用程序的正常运行。这个措施笔者用了很多年,非常有效。

二、异常管理的实用建议。

对于操作数据库异常,Java应用程序只提供一个异常类。因此,单靠Java应用程序的错误信息并不能帮助应用程序人员消除错误的原因。您只能指出是应用程序错误还是数据库错误导致了此异常。为了进一步指出问题的原因,最好在数据库级别定义异常时解释具体原因。例如,前台应用程序可以调用数据库的函数或过程。这个时候,做好数据库的函数或者过程,就可以解释一个异常的具体原因。比如从基本表生成另一个表时,某个字段不能为空,等等。把这些异常信息解释清楚后,如果真的遇到类似的异常,操作数据库异常类会把数据库的异常信息发回给前台用户。从而有利于用户在最短的时间内找到问题的原因并进行纠正。当然,这需要Java程序员和数据库设计人员之间的协调。

其次,应该注意的是,异常现象并不是常态。换句话说,大部分的异常都可以通过合理的预见和预防的前提来消除。如果设计了四则运算,可以在前台应用窗口中限制除数字段输入0值,以消除应用运算中可能出现的异常。但这往往需要应用开发者有丰富的工作经验和严密的思维逻辑。虽然这很难,但我觉得程序开发者应该在这方面做出努力,而不是总让用户做你的实验品,让用户发现应用中的设计bug。我认为只有一些超出程序人员控制的因素才允许抛出异常。如果应用程序开发人员能够意识到这种错误,但他们仍然不重视它或采取有效措施来防止这种异常,那么作者是不会允许的。

ArithmeticException(除数0异常)、BufferOverflowException(缓冲区溢出异常)、BufferUnderflowException(缓冲区下溢异常)、IndexOutOfBoundsException(越界异常)、NullPointerException(空指针异常)、EmptyStackException(空堆栈异常)、IllegalArgumentException(非法参数异常)、NegativeArraySizeException、NosuchelementException、SecurityException、SystemException、UndeclaredThrowableException

1.java.lang.NullPointerException

异常解释是‘程序遇到空指针’,简单来说就是调用未初始化的对象或者不存在的对象,也就是混淆了数组的初始化和数组元素的初始化。数组的初始化是给数组分配需要的空间,初始化后的数组中的元素没有实例化,仍然是空的,所以需要初始化每个元素(如果调用的话)。

2.Java . lang . classnotfoundexception

异常解释是“指定的类不存在”。

3.java.lang.ArithmeticException

对这种异常的解释是‘数学运算异常’。例如,如果程序中出现除零之类的运算,就会出现这种异常。

4.Java . lang . arrayindexoutofboundsexception

不正常的解释是‘数组下标越界’。现在,大多数程序都在数组上运行。因此,在调用数组时,必须仔细检查所调用的下标是否超出了数组的范围。一般来说,在显示(即直接用常量作为下标)调用中不容易出现这样的错误,而隐式(即用变量表示下标)调用却经常出错。在另一种情况下,程序中定义的数组长度是由一些特定的方法决定的。

5.Java . lang . illegalargumentexception

这个异常的解释是‘方法的参数错误’,比如g.setcolor中的三个值(int red,int green,int blue)。如果超过255个值,也会发生此异常。所以一旦发现这个异常,我们要做的就是快速检查方法调用中的参数传递是否有错误。

6.Java . lang . illegalaccessexception

对此例外的解释是“无访问权限”。当应用程序想要调用某个类,但当前方法没有访问该类的权限时,会发生此异常。当在程序中使用包时,请注意这个异常。

,异常,Java

感谢您的阅读,希望能帮到您,也感谢您对本站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: