Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 其他

Java APIs 和框架

Java 类引用

Java 有用资源

Java - 自定义异常



Java 自定义异常

自定义异常指的是根据需要创建您自己的异常来定制异常。自定义异常派生自Exception类。

Java 自定义异常的必要性

  • 根据项目中不同类型的错误对异常进行分类。
  • 允许应用程序级别的异常处理。

在 Java 中创建自定义异常

要创建自定义异常,需要创建一个,该类必须继承自 Exception 类。

语法

以下是 Java 中创建自定义类的语法:

class MyException extends Exception {
}

您只需要扩展预定义的Exception类即可创建您自己的异常。这些被认为是已检查异常。

创建自定义异常的规则

编写您自己的异常类时,请记住以下几点:

  • 所有异常都必须是 Throwable 的子类。

  • 如果要编写由“处理或声明”规则自动强制执行的已检查异常,则需要扩展 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 类包含一个抛出 InsufficientFundsException 的 withdraw() 方法。

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("Depositing $500...");
      c.deposit(500.00);
      
      try {
         System.out.println("\nWithdrawing $100...");
         c.withdraw(100.00);
         System.out.println("\nWithdrawing $600...");
         c.withdraw(600.00);
      } catch (InsufficientFundsException e) {
         System.out.println("Sorry, but you are short $" + 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。这将产生以下结果:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Sorry, but you are short $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 创建自定义类的示例

我们扩展预定义的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("Depositing $500...");
      c.deposit(500.00);
      
      System.out.println("\nWithdrawing $100...");
      c.withdraw(100.00);
      System.out.println("\nWithdrawing $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。这将产生以下结果:

Depositing $500...

Withdrawing $100...

Withdrawing $600...
Exception in thread "main" 
com.tutorialspoint.InsufficientFundsException
	at com.tutorialspoint.CheckingAccount.withdraw(BankDemo.java:35)
	at com.tutorialspoint.BankDemo.main(BankDemo.java:13)
广告