异常的概念

异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序编译或运行期间,干扰了正常的指令流程。

Java中的Throwable类是所有异常的基类。它的的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。

Java异常类层次结构及概念

Throwable

Throwable 类是 Java 语言中所有错误或异常的超类

异常与错误

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

1 Exception 类及其子类用来处理程序错误,它指出了合理的应用程序想要捕获的条件,表示程序本身可以处理的异常

2 Error 是及其子类用来处理系统错误,表示仅靠程序本身无法恢复的严重错误,用于指示合理的应用程序不应该试图捕获的严重问题,Java编译器不去检查这类异常

运行时异常

RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。

可查异常 和 不可查异常

通常,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。

可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常状况,就必须采取某种方式进行处理。

除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。

Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

运行时异常 和非运行时异常

运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

处理异常机制

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。异常总是先被抛出,后被捕捉的。

对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同。

只有在try里面是有System.exit(0)来退出JVM的情况下finally块中的代码才不会执行。

由于运行时异常的不可查性,为了更合理、更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。

对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。

对于所有的可查异常,Java规定:一个方法必须捕捉,或者声明抛出方法之外。也就是说,当一个方法选择不捕捉可查异常时,它必须声明将抛出异常。

Throws抛出异常的规则:

1) 如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

2)必须声明方法可抛出的任何可查异常(checked exception)。即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误

3)仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣。

4)调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。

异常处理最佳实践

1)为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。

2)在finally程序块中关闭或者释放资源

3)在堆栈跟踪中包含引起异常的原因

Java异常类提供了 getCause()方法来检索导致异常的原因,这些(原因)可以对异常的根层次的原因提供更多的信息。该Java实践对在进行调试或排除故障大有帮助。时刻记住,如果你将一个异常包装成另一种异常时,构造一个新异常要传递源异常。

4)始终提供关于异常的有意义的完整的信息

5)避免过度使用检查型异常

6)将检查型异常转为运行时异常

这是在像Spring之类的多数框架中用来限制使用检查型异常的技术之一,大部分出自于JDBC的检查型异常,都被包装进DataAccessException中,而(DataAccessException)异常是一种非检查型异常。这是Java最佳实践带来的好处,特定的异常限制到特定的模块,像 SQLException 放到DAO层,将意思明确的运行时异常抛到客户层。

7)记住对性能而言,异常代价高昂

需要记住的一件事是异常代价高昂,同时让你的代码运行缓慢。假如你有方法从ResultSet(结果集)中进行读取,这时常会抛出SQLException异常而不会移到下一元素,这将会比不抛出异常的正常代码执行的慢的多。因此最大限度的减少不必要的异常捕捉和移动,那里没有什么固定的原因。不要仅仅是抛出和捕捉异常,如果你能使用boolean变量去表示执行结果,可能会得到更整洁,更高性能的解决方案。修正错误的根源,避免不必须要的异常捕捉。

8)避免catch块为空

9)使用标准异常

对于维护性和一致性,不管是现在还是以后,都是最好的选择

10)记录任何方法抛出的异常

Java提供了throw和throws关键字来抛出异常,在javadoc中用@throw记录任何方法可能会抛出的异常。如果你编写API或者公共接口,这就变得非常重要。任何方法抛出的异常都有相应的文档记录,这样你就能下意识的提醒任何使用(该方法)的人。

常见的面试问题

1 既然我们可以用RuntimeException来处理错误,那么你认为为什么Java中还存在检查型异常?

答:存在检查型异常是一个设计上的决定,受到了诸如C++等比Java更早的编程语言设计经验的影响。绝大多数检查型异常位于java.io包内,这是合乎情理的,因为在你请求了不存在的系统资源的时候,一段强壮的程序必须能够优雅的处理这种情况。通过把IOException声明为检查型异常,Java 确保了你能够优雅的对异常进行处理。另一个可能的理由是,可以使用catch或finally来确保数量受限的系统资源(比如文件描述符)在你使用后尽早得到释放

2 throw 和 throws这两个关键字在java中有什么不同?

答:throws出现在方法声明中,用来标明该成员函数可能抛出的各种异常

throw出现在方法体中,表示抛出某种异常

3 什么是“异常链”?

答:“异常链”是Java中非常流行的异常处理概念,是指在进行一个异常处理时抛出了另外一个异常,由此产生了一个异常链条。该技术大多用于将“ 受检查异常” ( checked exception)封装成为“非受检查异常”(unchecked exception)或者RuntimeException。顺便说一下,如果因为因为异常你决定抛出一个新的异常,你一定要包含原有的异常,这样,处理程序才可以通过getCause()和initCause()方法来访问异常最终的根源。

4 JDK7中对异常处理做了什么改变?

答:JDK7中对错误(Error)和异常(Exception)处理主要新增加了2个特性,一是在一个catch块中可以出来多个异常,就像原来用多个catch块一样。另一个是自动化资源管理(ARM), 也称为try-with-resource块。这2个特性都可以在处理异常时减少代码量,同时提高代码的可读性。

5 Java中final,finalize,finally关键字的区别

答:final和finally是Java的关键字,而finalize则是方法。final关键字在创建不可变的类的时候非常有用,只是声明这个类是final的。而finalize()方法则是垃圾回收器在回收一个对象前调用,但也Java规范里面没有保证这个方法一定会被调用。finally关键字异常处理相关的关键字

java表示非法参数的异常是_JAVA 的异常那些事相关推荐

  1. Java中非法参数的异常_Java中的异常

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  2. Java中非法参数的异常,java中常见的异常语句

    Java中常见的8种异常语句 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组下 ...

  3. java 中的finally你知多少_Java 处理异常 9 个最佳实践,你知道几个?

    1. 在Finally中清理资源或者使用Try-With-Resource语句使用Finally Java 7的Try-With-Resource语句 2. 给出准确的异常处理信息 3. 记录你所指定 ...

  4. java 异常限制_java的异常限制

    class Exception1 extends Exception{} class Exception2 extends Exception{} class Exception3 extends E ...

  5. java 常见异常汇总_Java常见异常总结

    1. java.lang.NullPointerException(空指针异常) 调用了未经初始化的对象或者是不存在的对象 经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的 ...

  6. java 异常 日志_java(异常和日志)

    java异常看这篇就够了http://www.cnblogs.com/lulipro/p/7504267.html 1.类路径 所谓的类路径就是指程序运行时jvm要加载的类的.class文件所在地方 ...

  7. java 异常提示_Java显示异常信息与异常分类

    运行上述代码,输出结果如下下图所示: 使用printStackTrace方法可以获取异常的具体类型,这样就可以在使用throw是抛出一个确切的异常. 2. 异常的分类 从编程角度考虑,可以将异常分为以 ...

  8. java异常面试_java中异常的面试

    https://blog.csdn.net/qq_36523638/article/details/79363652 1) Java中的检查型异常和非检查型异常有什么区别? 这又是一个非常流行的Jav ...

  9. java 参数类型不确定_java泛型的那些事

    学习泛型的理由 首先明确为什么需要学习泛型?个人觉得至少有三个理由:1.使用泛型可以让你在声明类(或者创建方法)的时候不着急立即去指定它的类型,而是等到你实例化对象(或者方法调用)的时候才明确它的类型 ...

  10. java函数只有参数类不一样_java的函数参数传递

    java中只有一种参数传递方式:传值:这点和c++不一样,c++中有传值和引用两种方式.虽然java只有传值这 一种传递方式,但是根据参数类型的不同,函数对参数的影响也会不一样.可以这么说:形参是实参 ...

最新文章

  1. Arthas | 定位线上 Dubbo 线程池满异常
  2. django model filter_django中探索如何提高查询数据效率
  3. Mac Hadoop的安装与配置
  4. 用计算机对话的小品,爆笑小品剧本台词《作弊记》
  5. 原来,是我的眼光出了错
  6. 一个简单的GTK的例子程序
  7. ASP Session的功能的缺陷以及解决方案
  8. D. Beautiful numbers
  9. 微信小程序api封装方案
  10. 虚拟机桥接模式下设置桥接的网卡
  11. CSS定位—固定定位 fixed
  12. 如何占用计算机大量内存,windows7内存占用率高如何处理_win7电脑内存占用过高怎么办...
  13. 用keil怎么擦除_keil如何使用?图文教程告诉你keil怎么使用
  14. 微信扫描二维码跳转手机默认浏览器打开下载app的链接是怎么实现的
  15. 一元函数、多元函数的泰勒公式
  16. mycobot 使用教程
  17. Communication-Efficient Federated Learning for Wireless Edge Intelligence in IoT
  18. CT是新冠肺炎有效诊断工具
  19. 指令集CEO潘爱民受聘为之江实验室智能计算数字反应堆首席架构师
  20. MOVICS系列教程(一) GET Module

热门文章

  1. 两周,好多人的帮助解决select空列不显示的function
  2. 智能驾驶的深度神经网络模型嵌入式部署的线路思考
  3. Matlab图形窗口大小的控制 ,plot窗口大小,figure大小,axis设置
  4. vue-router动态路由设置参数可选
  5. 凸优化第三章凸函数 作业题
  6. householder变换解线性方程组matlab实现
  7. 中国首家干线物流联合创新中心成立,实施自动驾驶数据共享是否可行?...
  8. Linux命令——uptime
  9. 诺基亚收购阿朗再交易 持股比例将超95%
  10. MySQL设置字符编码