📜  Java中的 Throwable 类和示例

📅  最后修改于: 2022-05-13 01:54:26.573000             🧑  作者: Mango

Java中的 Throwable 类和示例

类和对象是面向对象编程的基本概念,围绕现实生活中的实体展开。类是用户定义的蓝图或原型,从中创建对象。它表示一种类型的所有对象共有的一组属性或方法。在本文中,我们将讨论Throwable类、它的构造函数以及该类中可用的不同方法。

Throwable类是Java语言中每个错误和异常的超类。只有属于此类子类之一的对象才会被任何“Java虚拟机”抛出,或者可能被Java throw 语句抛出。出于在编译时检查异常的动机, Throwable和 Throwable 的任何子类(不是 Error 或 RuntimeException 的子类)都被视为已检查异常。

Throwable 类是Java Exception Hierarchy 的根类,由两个子类继承:
1.异常
2.错误
throwable 类实现了 Serializable 接口,Throwable 的直接已知类是 Error 和 Exception。
Throwable 包含其线程在创建时的执行堆栈的快照。它还可以包含提供有关错误的更多信息的消息字符串。它还可以抑制其他 throwable 的传播。

如果用户想要创建自己的自定义 throwable,那么他/她可以扩展 Throwable 类。

例子:
MyThrowable 类扩展 Throwable{
//这里用户可以创建自己的自定义throwable
}
GFG类{
公共 void test() 抛出 MyThrowable{
// 创建的自定义 throwable 可以如下使用
抛出新的 MyThrowable();
}
}

Java.lang.Throwable类的类声明如下:

Java
public class Throwable
    extends Object
    implements Serializable


Java
// Java program to demonstrate
// the toString() Method.
 
import java.io.*;
 
class GFG {
 
    // Main Method
    public static void main(String[] args)
        throws Exception
    {
 
        try {
 
            testException();
        }
 
        catch (Throwable e) {
 
            // Print using tostring()
            System.out.println("Exception: "
                               + e.toString());
        }
    }
 
    // Method which throws Exception
    public static void testException()
        throws Exception
    {
 
        throw new Exception(
            "New Exception Thrown");
    }
}


Java
// Java program to demonstrate
// the getMessage() Method.
 
import java.io.*;
 
class GFG {
 
    // Main Method
    public static void main(String[] args)
        throws Exception
    {
 
        try {
 
            // Divide the numbers
            divide(2, 0);
        }
 
        catch (ArithmeticException e) {
 
            System.out.println(
                "Message String = "
                + e.getMessage());
        }
    }
 
    // Method which divides two numbers
    public static void divide(int a, int b)
        throws ArithmeticException
    {
 
        int c = a / b;
        System.out.println("Result:" + c);
    }
}


构造函数任何类都可以具有三种构造函数中的任何一种或全部三种构造函数。它们是默认的、参数化的和非参数化的构造函数。该类主要定义了以下构造函数:

公共构造函数

  1. Throwable():它是一个非参数化的构造函数,它构造一个新的 Throwable,其详细消息为 null。
  2. Throwable(String message):它是一个参数化的构造函数,它使用特定的详细消息构造一个新的 Throwable。
  3. Throwable(String message, Throwable Cause):它是一个参数化的构造函数,它构造一个带有特定详细消息和原因的新Throwable。
  4. Throwable(Throwable cause):它是一个参数化的构造函数,它通过使用toString()方法将case转换为String,构造一个带有特定原因和详细原因消息的新Throwable。

受保护的构造函数
1. Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) :构造一个新的throwable,指定详细消息,原因,抑制启用或禁用,可写堆栈跟踪启用或禁用。
参数是:-
message – 详细信息。
原因——原因。 (允许使用空值,表示原因不存在或未知。)
enableSuppression – 是否启用或禁用抑制
writableStackTrace – 堆栈跟踪是否应该是可写的。

方法:除了上面提到的构造函数之外,throwable 类中还有许多预定义的方法。他们是:

1. addSuppressed(Throwable exception) :此方法将指定的异常附加到被抑制的异常以传递此异常。
句法:
公共最终无效 addSuppressed(可抛出异常)
返回:此方法不返回任何内容。
2. fillInStackTrace() :填充执行堆栈跟踪。此方法记录有关当前 Throwable 对象中当前线程的堆栈帧的当前状态的信息。
句法:
public Throwable fillInStackTrace ()
返回:对当前 Throwable 实例的引用。
3. getCause() :它返回通过需要 Throwable 的构造函数之一提供的原因,或者在使用 initCause() 方法创建之后设置的原因。
句法:
公共Throwable getCause()
返回:当前 Throwable 的原因。如果原因不存在或未知,则返回 null。
4. getLocalizedMessage() :此方法创建当前 Throwable 的本地化描述。
句法:
公共字符串 getLocalizedMessage ()
返回:当前 Throwable 的本地化描述
5. getMessage() :返回当前 throwable 的详细消息字符串。
句法:
公共字符串getMessage()
返回:当前 Throwable 实例的详细消息字符串(也可能返回 null)
6. getStackTrace() :此方法提供对 printStackTrace() 打印的堆栈跟踪信息的编程访问。它返回一个堆栈跟踪元素数组,每个元素代表一个堆栈帧。数组的第零个元素(假设数组的长度非零)是序列中的最后一个方法调用。它也代表堆栈的顶部,并且是创建和抛出这个可抛出对象的点。数组的最后一个元素(假设数组的长度不为零)是序列中的第一个方法调用,它表示堆栈的底部。
句法:
公共 StackTraceElement[] getStackTrace ()
返回: 堆栈跟踪元素数组,表示与当前 Throwable 相关的堆栈跟踪。
7. getSuppressed() :返回一个包含所有被抑制的异常的数组,以传递此异常。如果没有抑制异常或禁用抑制,则返回一个空数组。
语法:public final Throwable[] getSuppressed()
返回: 一个数组,其中包含为传递此异常而被抑制的所有异常。
8. initCause(Throwable cause) :将当前Throwable的原因初始化为指定值。该方法最多可以调用一次。它通常在构造函数中调用,或者在创建 throwable 之后立即调用。
语法:public Throwable initCause(可抛出原因)
参数:
Throwable Cause- 当前 Throwable 的原因。
抛出:
1.IllegalArgumentException:如果cause是当前的throwable,则抛出此异常,因为throwable不能是它自己的原因。
2. IllegalStateException:如果当前throwable已经调用了这个方法,就会发生。
返回:对当前 Throwable 实例的引用。
9. printStackTrace() :将当前的 throwable 及其回溯打印到标准错误流。
语法:public void printStackTrace()
返回:此方法不返回任何内容。
10. printStackTrace(PrintWriter s) :将当前的 throwable 及其回溯打印到指定的 print writer。
语法:public void printStackTrace (PrintWriter s)
参数: PrintWriter- 用于输出的 PrintWriter
返回:此方法不返回任何内容。
11. printStackTrace(PrintStream s) :打印当前throwable及其回溯到指定的打印流。
语法:public void printStackTrace (PrintStream s)
参数: PrintStream - 用于输出的 PrintStream
返回:此方法不返回任何内容。
12. setStackTrace(StackTraceElement[] stackTrace) :该方法设置将由getStackTrace()返回并由printStackTrace()和相关方法打印的堆栈跟踪元素。
语法:public void setStackTrace (StackTraceElement[] stackTrace)
参数: StackTraceElement - 这些是要与当前 Throwable 关联的堆栈跟踪元素。
抛出:
NullPointerException - 如果 stackTrace 为 null 或 stackTrace 的任何元素为 null
回报:
此方法不返回任何内容。
13. toString() :该方法返回当前throwable的简短描述。
语法:public String toString()
返回: 当前 throwable 的字符串表示形式。

下面的程序演示了 Throwable 类的toString()方法:

Java

// Java program to demonstrate
// the toString() Method.
 
import java.io.*;
 
class GFG {
 
    // Main Method
    public static void main(String[] args)
        throws Exception
    {
 
        try {
 
            testException();
        }
 
        catch (Throwable e) {
 
            // Print using tostring()
            System.out.println("Exception: "
                               + e.toString());
        }
    }
 
    // Method which throws Exception
    public static void testException()
        throws Exception
    {
 
        throw new Exception(
            "New Exception Thrown");
    }
}
输出:
Exception:
 java.lang.Exception:
 New Exception Thrown

下面的程序演示了Java.lang.Throwable 类的getMessage()方法:

Java

// Java program to demonstrate
// the getMessage() Method.
 
import java.io.*;
 
class GFG {
 
    // Main Method
    public static void main(String[] args)
        throws Exception
    {
 
        try {
 
            // Divide the numbers
            divide(2, 0);
        }
 
        catch (ArithmeticException e) {
 
            System.out.println(
                "Message String = "
                + e.getMessage());
        }
    }
 
    // Method which divides two numbers
    public static void divide(int a, int b)
        throws ArithmeticException
    {
 
        int c = a / b;
        System.out.println("Result:" + c);
    }
}
输出:
Message String = / by zero

参考:https://docs.oracle.com/javase/9/docs/api/ Java/lang/Throwable.html/