自定义异常是指根据需要创建自己的异常来定制异常。自定义异常是从 Exception
类派生出来的。
Java 自定义异常的需求
创建 Java 自定义异常
要创建一个自定义异常,你需要创建一个类,并且这个类必须继承自 Exception
类。
语法
创建自定义类的语法如下:
class MyException extends Exception {
}
只需要扩展预定义的 Exception
类就可以创建自己的异常。这些被认为是已检查异常。
创建自定义异常的规则
在编写自己的异常类时,请记住以下几点:
-
-
如果你想写一个由处理或声明规则自动强制执行的已检查异常,你需要扩展
Exception
类。
-
如果你想写一个运行时异常,你需要扩展
RuntimeException
类。
Java 自定义异常示例
下面的 InsufficientFundsException
类是一个用户定义的异常,它扩展了 Exception
类,使其成为一个已检查异常。异常类和其他任何类一样,包含有用的字段和方法。
class InsufficientFundsException extends Exception {
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
为了演示如何使用我们定义的异常,下面的 CheckingAccount
类包含了一个 withdraw()
方法,该方法会抛出 InsufficientFundsException
。
class CheckingAccount {
private double balance;
private int number;
public CheckingAccount(int number) {
this.number = number;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException {
if(amount <= balance) {
balance -= amount;
} else {
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance() {
return balance;
}
public int getNumber() {
return number;
}
}
下面的 BankDemo
程序演示了调用 CheckingAccount
的 deposit()
和 withdraw()
方法。
package com.tutorialspoint;
public class BankDemo {
public static void main(String [] args) {
CheckingAccount c = new CheckingAccount(101);
System.out.println("存入 $500...");
c.deposit(500.00);
try {
System.out.println("\n取款 $100...");
c.withdraw(100.00);
System.out.println("\n取款 $600...");
c.withdraw(600.00);
} catch (InsufficientFundsException e) {
System.out.println("抱歉,您少了 $" + e.getAmount());
e.printStackTrace();
}
}
}
class CheckingAccount {
private double balance;
private int number;
public CheckingAccount(int number) {
this.number = number;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) throws InsufficientFundsException {
if(amount <= balance) {
balance -= amount;
} else {
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance() {
return balance;
}
public int getNumber() {
return number;
}
}
class InsufficientFundsException extends Exception {
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
输出
编译上述三个文件并运行 BankDemo
。这将产生如下结果:
存入 $500...
取款 $100...
取款 $600...
抱歉,您少了 $200.0
com.tutorialspoint.InsufficientFundsException
at com.tutorialspoint.CheckingAccount.withdraw(BankDemo.java:39)
at com.tutorialspoint.BankDemo.main(BankDemo.java:14)
在下一个示例中,我们将自定义异常声明为 RuntimeException
,以将其作为未检查异常类,如下所示:
class MyException extends RuntimeException {
}
通过扩展运行时异常创建自定义类的示例
我们通过扩展预定义的 RuntimeException
类来创建自己的异常作为未检查异常。下面的 InsufficientFundsException
类是一个用户定义的异常,它扩展了 RuntimeException
类,使其成为一个未检查异常。RuntimeException
类和其他任何类一样,包含有用的字段和方法。
class InsufficientFundsException extends RuntimeException {
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
下面的 BankDemo
程序演示了使用未检查异常调用 CheckingAccount
的 deposit()
和 withdraw()
方法。
package com.tutorialspoint;
public class BankDemo {
public static void main(String [] args) {
CheckingAccount c = new CheckingAccount(101);
System.out.println("存入 $500...");
c.deposit(500.00);
System.out.println("\n取款 $100...");
c.withdraw(100.00);
System.out.println("\n取款 $600...");
c.withdraw(600.00);
}
}
class CheckingAccount {
private double balance;
private int number;
public CheckingAccount(int number) {
this.number = number;
}
public void deposit(double amount) {
balance += amount;
}
public void withdraw(double amount) {
if(amount <= balance) {
balance -= amount;
} else {
double needs = amount - balance;
throw new InsufficientFundsException(needs);
}
}
public double getBalance() {
return balance;
}
public int getNumber() {
return number;
}
}
class InsufficientFundsException extends RuntimeException {
private double amount;
public InsufficientFundsException(double amount) {
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
输出
编译并运行 BankDemo
。这将产生如下结果:
存入 $500...
取款 $100...
取款 $600...
主线程异常:
com.tutorialspoint.InsufficientFundsException
at com.tutorialspoint.CheckingAccount.withdraw(BankDemo.java:35)
at com.tutorialspoint.BankDemo.main(BankDemo.java:13)