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);
}
}
构造函数:任何类都可以具有三种构造函数中的任何一种或全部三种构造函数。它们是默认的、参数化的和非参数化的构造函数。该类主要定义了以下构造函数:
公共构造函数
- Throwable():它是一个非参数化的构造函数,它构造一个新的 Throwable,其详细消息为 null。
- Throwable(String message):它是一个参数化的构造函数,它使用特定的详细消息构造一个新的 Throwable。
- Throwable(String message, Throwable Cause):它是一个参数化的构造函数,它构造一个带有特定详细消息和原因的新Throwable。
- 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/