Java程序设计异常处理

Posted BkbK-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java程序设计异常处理相关的知识,希望对你有一定的参考价值。

异常处理

在这里插入图片描述

一、异常简介

1.异常的基本概念

  • 异常又称为例外,是特殊的运行错误对象
  • Java中声明了很多异常类,每个异常类都代表了一种运行错误,类中包含了
    • 该运行错误的信息
    • 处理错误的方法
  • 每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。

2.java处理异常的方法

  • 抛出(throw)异常:

    在方法的运行过程中,如果发生了异常,则该方法生成一个代表该异常的对象并把它交给运行时系统,运行时系统便寻找相应的代码来处
    理这一异常。

  • 捕获(catch)异常:

    运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯, 直到找到包含相应异常处理的方法为止。

3.Java异常处理机制的优点

• 将错误处理代码从常规代码中分离出来;
• 按错误类型和差别分组;
• 对无法预测的错误的捕获和处理;
• 克服了传统方法的错误信息有限的问题;
• 把错误传播给调用堆栈。

4.错误的分类

根据错误的严重程度不同,可分为两类:

  • 错误
    • 致命性的,程序无法处理;
    • Error类是所有错误类的父类。
  • 异常
    • 非致命性的,可编制程序捕获和处理;
    • Exception类是所有异常类的父类

二、Java异常类

1.Exception 类的层次

  • 所有的异常类是从 java.lang.Exception 类继承的子类。
  • Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
  • Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
  • Error 用来指示运行时环境发生的错误。

在这里插入图片描述

2.Java 内置异常类

Java 语言定义了一些异常类在 java.lang 标准包中。 标准运行时异常类的子类是最常见的异常类。
由于 java.lang包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。

  • Java的非检查性异常

    非检查型异常:

    • 不期望程序捕获的异常,在方法中不需要声明,编译器也不进行检查。
    • 继承自RuntimeException
    • 不要求捕获和声明的原因:
    • 引发RuntimeException的操作在Java应用程序中会频繁出现。例如,若每次使用对象时,都必须编写异常处理代码来检查null引用,则整个应用程序很快将变成一个庞大的try-catch块。
    • 它们表示的问题不一定作为异常处理。如:可以在除法运算时检查0值,而不使用ArithmeticException。可以在使用引用前测试空值。
    异常描述
    rithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。
    rrayIndexOutOfBoundsException用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
    rrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。
    lassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。
    llegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数。
    llegalMonitorStateException抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
    llegalStateException在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
    llegalThreadStateException线程没有处于请求操作所要求的适当状态时抛出的异常。
    ndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
    egativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。
    ullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常
    umberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
    ecurityException由安全管理器抛出的异常,指示存在安全侵犯。
    tringIndexOutOfBoundsException此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
    nsupportedOperationException当不支持请求的操作时,抛出该异常。
  • Java的检查性异常类

    检查型异常:

    • 其他类型的异常。
    • 如果被调用的方法抛出一个类型为E的检查型异常,那么调用者必须捕获E或者也声明抛出E(或者E的一个父类),对此编译器要进行检查。
    异常描述
    ClassNotFoundException应用程序试图加载类时,找不到相应的类,抛出该异常。
    CloneNotSupportedException当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
    IllegalAccessException拒绝访问一个类的时候,抛出该异常。
    InstantiationException当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
    InterruptedException一个线程被另一个线程中断,抛出该异常。
    NoSuchFieldException请求的变量不存在
    NoSuchMethodException请求的方法不存在

3. Throwable 类的主要方法

  • getMessage方法

    public String getMessage()
    

    返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。

  • getCause方法

    public Throwable getCause()
    

    返回一个Throwable 对象代表异常原因。

  • toString方法

    public String toString()
    

    使用getMessage()的结果返回类的串级名字。

  • printStackTrace方法

    public void printStackTrace()
    

    打印toString()结果和栈层次到System.err,即错误输出流。

  • getStackTrace方法

    public StackTraceElement [] getStackTrace()
    

    返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。

  • fillInStackTrace方法

    public Throwable fillInStackTrace()
    

    用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。

三、异常处理

1.抛出异常

不在当前方法内处理异常,可以使用throws子句声明将异常抛出到调 用方法中;
如果所有的方法都选择了抛出此异常,最后 JVM将捕获它,输出相关 的错误信息,并终止程序的运行。

  • 如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。

  • 可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

    import java.io.*;
    public class className
    {
      public void deposit(double amount) throws RemoteException
      {
        // Method implementation
        throw new RemoteException();
      }
      //Remainder of class definition
    }
    
  • 一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

    import java.io.*;
    public class className
    {
       public void withdraw(double amount) throws RemoteException,InsufficientFundsException
       {
           // Method implementation
       }
       //Remainder of class definition
    }
    

2.捕获异常

(1)捕获异常语法

  • try/catch代码块放在异常可能发生的地方

    try
    {
       // 程序代码
    }catch(ExceptionName e1)
    {
       //Catch 块
    }finally{
    // 程序代码
    }
    
  • 一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。

    	try{
      // 程序代码
    }catch(异常类型1 异常的变量名1){
      // 程序代码
    }catch(异常类型2 异常的变量名2){
      // 程序代码
    }finally{
      // 程序代码
    }
    

(2)关键字

  • try/catch 关键字
    使用 try 和 catch 关键字可以捕获异常。try/catch代码块中的代码称为保护代码。
  • finally关键字
    • finally 关键字用来创建在 try 代码块后面执行的代码块。
    • 无论是否发生异常,finally 代码块中的代码总会被执行。
    • 在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

3.声明自定义异常

  • 所有异常都必须是 Throwable 的子类。
  • 如果希望写一个检查性异常类,则需要继承 Exception 类。
  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

自定义异常语法

class MyException extends Exception{
}

以上是关于Java程序设计异常处理的主要内容,如果未能解决你的问题,请参考以下文章

异常和TCP通讯

java 反射代码片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

片段中的 EditText 上的空指针异常 [重复]

Java随笔四---Java异常

java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常(代码片段