Java 简明教程

Java - Custom Exception

Java Custom Exception

自定义异常是指根据 exception 的需求创建一个你自己的异常来定制它。自定义异常来自 Exception 类。

The custom exception refers to the creation of your own exception to customize an exception according to the needs. The custom exceptions are derived from the Exception class.

Need of Java Custom Exceptions

  1. To categorize the exceptions based on the different types of errors in your project.

  2. To allow application-level exception handling.

Create a Custom Exception in Java

要创建一个自定义异常,你需要创建一个 class ,它必须从 Exception 类继承。

To create a custom exception, you need to create a class that must be inherited from the Exception class.

Syntax

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

Here is the syntax to create a custom class in Java -

class MyException extends Exception {
}

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

You just need to extend the predefined Exception class to create your own Exception. These are considered to be checked exceptions.

Rules to Create Custom Exception

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

Keep the following points in mind when writing your own exception classes −

  1. All exceptions must be a child of Throwable.

  2. If you want to write a checked exception that is automatically enforced by the Handle or Declare Rule, you need to extend the Exception class.

  3. If you want to write a runtime exception, you need to extend the RuntimeException class.

Java Custom Exception Example

以下 InsufficientFundsException 类是扩展 Exception 类的用户定义异常,使其成为受检异常。异常类与任何其他类一样,包含有用的字段和方法。

The following InsufficientFundsException class is a user-defined exception that extends the Exception class, making it a checked exception. An exception class is like any other class, containing useful fields and methods.

class InsufficientFundsException extends Exception {
   private double amount;

   public InsufficientFundsException(double amount) {
      this.amount = amount;
   }

   public double getAmount() {
      return amount;
   }
}

为了演示如何使用我们用户定义的异常,以下 CheckingAccount 类包含一个 withdraw() 方法,该方法会抛出一个 InsufficientFundsException。

To demonstrate using our user-defined exception, the following CheckingAccount class contains a withdraw() method that throws an 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() 方法。

The following BankDemo program demonstrates invoking the deposit() and withdraw() methods of CheckingAccount.

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。这将产生以下结果:

Compile all the above three files and run BankDemo. This will produce the following result −

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 以使其成为未经检查的异常类,如下所示 -

In next example, we’re declaring our custom exception as RuntimeException to make it as unchecked exception class as below −

class MyException extends RuntimeException {
}

Example to Create Custom Class by Extending Runtime Exception

我们正在扩展预定义的 RuntimeException 类以创建自己的 Exception 作为未经检查的异常。以下 InsufficientFundsException 类是扩展 RuntimeException 类的用户定义异常,使其成为未经检查的异常。RuntimeException 类与任何其他类一样,包含有用的字段和方法。

We are extending the predefined RuntimeException class to create your own Exception as an unchecked exception. The following InsufficientFundsException class is a user-defined exception that extends the RuntimeException class, making it a unchecked exception. An RuntimeException class is like any other class, containing useful fields and methods.

class InsufficientFundsException extends RuntimeException {
   private double amount;

   public InsufficientFundsException(double amount) {
      this.amount = amount;
   }

   public double getAmount() {
      return amount;
   }
}

以下 BankDemo 程序演示使用未经检查的异常调用 CheckingAccount 的 deposit() 和 withdraw() 方法。

The following BankDemo program demonstrates invoking the deposit() and withdraw() methods of CheckingAccount using unchecked exception.

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。这将产生以下结果 -

Compile and run BankDemo. This will produce the following result −

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)