JavaSE-08-Java异常详解

 

Java异常详解

1:异常的定义

1.1:异常的基础知识

在 Java 编程语言中,异常是指当程序出错时创建的一种特殊的运行时错误对象。注意这个错误不是编译时的语法错误。

Java 创建异常对象后,就发送给 Java 程序,即抛出异常(throwing an exception)。程序捕捉到这个异常后,可以编写相应的异常处理代码进行处理,而不是让程序中断。使用异常处理可以提高程序的健壮性,有助于调试和后期维护。

1.2:异常的实例

当 Java 运行时系统检查到被零除的情况,它构造一个新的异常对象然后引发该异常。这会导致程序的失败;执行不下去

2:异常的处理

Java 提供了一种异常处理模型,它使您能检查异常并进行相应的处理。它实现的是异常处理的抓抛模型。使用此模型,您只需要注意有必要加以处理的异常情况。Java 提供的这种异常处理模型,代替了用返回值或参数机制从方法返回异常码的手段。

2.1:try-catch

try 块由一组可执行语句组成,在执行它们时可能会抛出异常。catch 块,是用来捕获并处理 try 中抛出的异常的代码块。 catch 块不能单独存在,可以有多个 catch 块,以捕获不同类型的异常。

try 不可以跟随在 catch 块之后。

一旦异常被引发,程序控制由 try 块转到catch 块。执行永远不会从 catch 块“返回”到 try 块。

一个 try 和它的 catch 语句形成了一个单元。catch 子句的范围限制于 try 语句前面所定义的语句。一个 catch 语句不能捕获另一个 try 声明所引发的异常

构造catch子句的目的是解决异常情况并且像错误没有发生一样继续运行。

try 块可以嵌套,也就是说,一个 try 语句可以在另一个 try 块内部。每次进入 try 语句,异常的前后关系都会被推入堆栈。如果一个内部的 try 语句不含特殊异常的 catch 处理程序,堆栈将弹出,下一个 try 语句的 catch 处理程序将检查是否与之匹配。这个过程将继续直到一个 catch 语句匹配成功,或者是直到所有的嵌套 try 语句被检查耗尽。如果没有 catch 语句匹配,Java 的运行时系统将处理这个异常。

catch可以有多个,但是catch所捕获的异常,必须先子类后父类,否则会编译出错

2.2:finally 块

finally 块表示:无论是否出现异常,都会运行的块

通常在 finally 块中可以编写资源返还给系统的语句,通常,这些语句包括但不限于:
(1)释放动态分配的内存块:
(2)关闭文件;
(3)关闭数据库结果集;
(4)关闭与数据库建立的连接;

它紧跟着最后一个块,是可选的,不论是否抛出异常,finally 块总会被执行。finally 块的语法如下:

try{
}catch(异常类型 1 e){
}catch(异常类型 2 e){
}finally{
}

无论 try 块是否抛出异常,都会执行 finally 块。

2.3:try 、catch 、finally 的关系

(1)try 块不能单独存在,后面必须跟 catch 块或者 finally 块。
(2)三者之间的组合为:try—catch 、try—catch—finally 、 try—finally这几种是合法的。
(3)一个 try 块可以有多个 catch 块,从上到下多个 catch 块的范围为从小到大。 

2.4:throw 语句

throw 语句用来从代码中主动抛出异常,可以将它理解为一个向上抛出的动作。throw 的操作数是任一种异常类对象。是 Throwable 类类型或 Throwable 子类类型的一个对象。简单类型,例如 int 或 char,以及非 Throwable 类,例如 String 或 Object,不能用作异常。

 public static void main(String[] args) throws ParseException {
        try {
            createException();
        } catch (ZycxException e) {
            //处理异常
        }

    }

    public static void createException() throws ZycxException {
        try {
            //业务处理
        }catch (Exception e){
            //发生异常时向上抛出我们自定义的异常
            throw new ZycxException("发生异常了!!");
        }
    }

我们自定义的异常: 

/**
 * Description:自定义异常
 * Date:       2020/4/28 - 下午 5:57
 * author:     wangkanglu
 * version:    V1.0
 */
public class ZycxException extends Exception{
    public ZycxException(){}

    public ZycxException(String msseage){
        super(msseage);
    }
}

2.5:throws 语句

throws 用来在方法定义时声明异常。

Java 中对异常的处理有两种方法,一个就是 try-catch,然后自己处理;一个就是不做处理,向外 throws,由调用该方法的代码去处理。

2.6  调用栈机制

如果方法中的一个语句抛出一个没有在相应的 try/catch 块中处理的异常,那么这个异常就被抛出到调用方法中。如果异常也没有在调用方法中被处理,它就被抛出到该方法的调用程序。这个过程要一直延续到异常被处理。如果异常到这时还没被处理,它便回到 main(), 而且,即使 main()不处理它,那么,该异常就异常地中断程序。

3:异常的分类

3.1:异常的分类

在 Java 编程语言中,异常有两种分类。java.lang.Throwable 类充当所有对象的父类,可以使用异常处理机制将这些对象抛出并捕获。在 Throwable 类中定义方法来检索与异常相关的错误信息,并打印显示异常发生的栈跟踪信息。它有 Error 和 Exception 两个基本子类。

错误(Error):JVM 系统内部错误、资源耗尽等严重情况;

异常(Exception 违例):其它因编程错误或偶然的外在因素导致的一般性问题,例如:对负数开平方根、空指针访问、试图读取不存在的文件、网络连接中断等。

当发生 Error 时,程序员根本无能为力,只能让程序终止。比如说内存溢出,不可能指望程序能处理这样的情况。而对于 Exception,而有补救或控制的可能,程序员也可以预先防范,本章主要讨论 Exception 的处理。

 

RuntimeException(运行时异常)是指因设计或实现方式不当导致的问题。也可以说,是程序员的原因导致的,本来可以避免发生的情况。

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

3.1:预定义异常---Java规定好的异常

Java 编程语言中预先定义好的异常叫预定义异常,上面提到的异常都是预定义异常,这些异常的产生不需要程序员手动抛出,即不需要使用throw语句抛出异常,当产生异常时,系统会自动抛出。下面是几种常见的异常:

受检查异常:

3.3:自定义异常

Java 语言允许用户在需要时创建自己的异常类型,用于表述 JDK 中未涉及到的其它异常状况,这些类型也必须继承 Throwable 类或其子类。用户自定义异常类通常属 Exception 范畴,依据命名惯例,应以 Exception 结尾。用户自定义异常未被加入 JRE 的控制逻辑中,因此永远不会自动抛出,只能由人工创建并抛出。

 例子:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章