博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java语法基础-异常处理
阅读量:6341 次
发布时间:2019-06-22

本文共 3042 字,大约阅读时间需要 10 分钟。

异常处理类层次结构图

 

检查异常与非检查异常

  •     非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。
  •     检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。

异常与错误

  •     在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable。Throwable:有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。
  •     Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
  • 这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
  •     Exception(异常):是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException。RuntimeException 异常由Java虚拟机抛出。NullPointerException(要访问的变量没有引用任何对象时,抛出该异常)、ArithmeticException(算术运算异常,一个整数除以0时,抛出该异常)和 ArrayIndexOutOfBoundsException (下标越界异常)。
  •     注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

Throwable类常用方法

  •     public string getMessage():返回异常发生时的详细信息
  •     public string toString():返回异常发生时的简要描述
  •     public string getLocalizedMessage():返回异常对象的本地化信息。使用Throwable的子类覆盖这个方法,可以声称本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与getMessage()返回的结果相同
  •     public void printStackTrace():在控制台上打印Throwable对象封装的异常信息

异常处理总结

  •     try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
  •     catch 块:用于处理try捕获到的异常。
  •     finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。

在以下4种特殊情况下,finally块不会被执行:

  •     在finally语句块中发生了异常。
  •     在前面的代码中用了System.exit()退出程序。
  •     程序所在的线程死亡。
  •     关闭CPU。

基本语法

-try…catch…finally语句块

try{     //try块中放可能发生异常的代码。     //如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。     //如果发生异常,则尝试去匹配catch块。}catch(SQLException SQLexception){    //每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。    //catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。    //在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。    //如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。    //如果try中没有发生异常,则所有的catch块将被忽略。}catch(Exception exception){    //...}finally{    //finally块通常是可选的。   //无论异常是否发生,异常是否匹配被处理,finally都会执行。   //一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。  //finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。 }

异常抛出点

 

  •  从上面的例子可以看出,当devide函数发生除0异常时,devide函数将抛出ArithmeticException异常,因此调用他的CMDCalculate函数也无法正常完成,因此也发送异常,而CMDCalculate的caller——main 因为CMDCalculate抛出异常,也发生了异常,这样一直向调用栈的栈底回溯。这种行为叫做异常的冒泡,异常的冒泡是为了在当前发生异常的函数或者这个函数的caller中找到最近的异常处理程序。由于这个例子中没有使用任何异常处理机制,因此异常最终由main函数抛给JRE,导致程序终止。
  •     上面的代码不使用异常处理机制,也可以顺利编译,因为2个异常都是非检查异常。

转载于:https://www.cnblogs.com/moonlightml/p/9776721.html

你可能感兴趣的文章
Clone sqlite table with structure
查看>>
使用JavaMelody监控Java EE应用
查看>>
linux自动化建互信
查看>>
CENTOS5下采用LVS +KEEPALIVED实现负载均衡
查看>>
TOMCAT部署项目的方式
查看>>
android手电源码
查看>>
【Camera】手机相机自动对焦的3种方式及原理
查看>>
dhtmlxTree ie9兼容
查看>>
如何在Linux中配置DHCP服务器及DHCP中继服务
查看>>
HTML-图片转换为base64位上传
查看>>
深入Log4J源码之Layout
查看>>
利用Oracle的wm_concat函数把行转为列,合并分组后的列值
查看>>
IPv4—介质无关性
查看>>
第11章练习
查看>>
Logstash 基础入门
查看>>
NoSQL——Redis部属
查看>>
Tomcat中用JNDI方式加载JDBC DataSource以连接数据库
查看>>
我的友情链接
查看>>
为什么说《千与千寻》是一部优秀的职场电影
查看>>
多线程下载技术
查看>>