解決 Java 中的 IllegalArgumentException

Sarwan Soomro 2023年10月12日
  1. Java 中 IllegalArgumentException 類的層次結構
  2. Java 中的執行時異常與編譯時異常
  3. 在 Java 中丟擲並解決 IllegalArgumentException
  4. 在 Java 中使用 TryCatch 使用 Scanner 確定 IllegalArgumentException
解決 Java 中的 IllegalArgumentException

本教程將通過顯示 java.lang.object 類中的 java.lang.IllegalArgumentException 類對異常層次結構進行分類。之後,我們將執行三個 Java 編碼塊來演示非法引數異常。

最後,我們將展示如何擺脫它們並解釋如何自定義它們。

Java 中 IllegalArgumentException 類的層次結構

觸發此異常是因為我們可能給 Java 函式提供了無效引數。此異常擴充套件了執行時異常類,如下圖所示。

因此,Java 虛擬機器執行時可能會觸發一個異常。但是,要完全掌握它,請檢視以下 Java 類:

  1. java.lang.object:類層次結構的根是 Class 物件。
  2. java.lang.Throwable:Throwable 類是所有 Java 錯誤和異常的超類。
  3. java.lang.Exception:擴充套件 Throwable 類,該類識別實際應用程式可能想要捕獲的情況。
  4. java.lang.RuntimeException:執行時異常是 Java 虛擬機器正常執行時可能產生的異常的超類。
  5. java.lang.IllegalArgumentException:丟擲以通知向方法提供了非法或不適當的引數。

illegalargumentexception 的層次結構圖。

Java 中的 IllegalArgumentException 層次結構

Java 中的執行時異常與編譯時異常

儘管大多數人都熟悉其中的區別,但許多人仍然不瞭解其簡單性。

下表說明了 Java 中執行時和編譯時錯誤/異常型別之間的區別。

編號 主題 執行時錯誤 編譯時錯誤
1 異常 在 JVM 的正常執行過程中丟擲 當 Java 程式的語義規則被破壞時,JVM 會將這個錯誤作為一個異常拋給程式。
2 參考資料 類執行時異常 編譯器異常
3 解決方案 在執行和識別程式碼之後。 在程式碼的開發過程中。

在 Java 中丟擲並解決 IllegalArgumentException

下面的程式會丟擲一個非法引數異常,因為我們不能在陣列列表的初始容量中傳遞一個負值作為引數。

示例 1:

package com.IllegalAE.util;
import java.util.ArrayList;
import java.util.List;
public class Example1 {
  public static void main(String[] args) {
    List<String> demoList = new ArrayList<>(-1);
    demoList.add("Red");
    demoList.add("Blue");
    demoList.add("Green");
    System.out.println(demoList);
  }
}

輸出:

示例 1 非法引數異常輸出

如果我們沒有在初始列表容量中傳遞負值,例如:List<String> demoList = new ArrayList<>(1);,我們會得到以下結果。

輸出:

[RED, GREEN, BLUE]

示例 2:

首先,你應該注意 int a 的值是 1000,而 int b 的值是 0。

package com.IllegalAE.util;
// class
public class Example2 {
  // main function
  public static void main(String[] args) {
    // constructor
    Demo2 examp2 = new Demo2();
    // add 2 numbers
    System.out.println(" The total of A and B is:  " + examp2.addTwoNums(10, 5));
  }
}
class Demo2 {
  public int addTwoNums(int a, int b) {
    // if the value of b is less than the value of a (trigger IllegalArgumentException with a
    // message)
    if (b < a) {
      throw new IllegalArgumentException("B  is not supposed to be less than " + a);
    }
    // otherwise, add two numbers
    return a + b;
  }
} // class

輸出:

示例 2 非法引數異常輸出

主函式包含通過建構函式傳遞的物件。由於 b 的值小於 a,所以觸發了非法引數異常。

如果我們像下面的程式碼一樣滑動 int ab 的值,

System.out.println(" The total of A and B is:  " + examp2.addTwoNums(0, 1000));

輸出:

The total of A and B is:  15

你還可以檢視下面的演示。

示例 2 程式碼塊非法引數異常的 gif 輸出

你可以設定非法引數條件以獲取正確的使用者輸入並控制你的邏輯流程。

同樣,Java 不允許我們通過傳遞非法引數來破壞方法。它是為了讓使用者編寫乾淨的程式碼並遵循標準的做法。

另一個原因是避免可能危及程式碼塊流的非法執行。

在 Java 中使用 TryCatch 使用 Scanner 確定 IllegalArgumentException

編寫程式結構以使用 trycatch 異常以及 Java 掃描程式類來確定非法引數異常。

以下是你需要首先考慮的幾點:

  1. 理解 java.util.Scanner 類。

    Scanner mySc = new Scanner(System.in);
    int demo = mySc.nextInt();
    

    請注意,上面的程式碼允許使用者閱讀 Java 的 System.in

  2. try...catch 異常處理:

    try {
      // It allows us to define a block of code that will be tested for errors while it runs.
    } catch (Exception e) {
      // It enables us to create a code block that will be invoked if an error occurs in the try block.
    }
    

    我們將能夠使用 try...catch 方法來利用非法引數異常,並以適合我們的方式對其進行修改。

例子:

package com.IllegalAE.util;
import java.util.Scanner;
public class IllegalArgumentExceptionJava {
  public static void main(String[] args) {
    String AddProduct = "+";
    execute(AddProduct);
  }
  static void execute(String AddProduct) {
    // allows user to read System.in
    // tries code block for testing errors
    try (Scanner nxtLINE = new Scanner(System.in)) {
      // to ignore user specified case consideration
      while (AddProduct.equalsIgnoreCase("+")) {
        // The code inside try block will be tested for errors
        try {
          System.out.println("Please enter a new product ID: ");
          int Productid = nxtLINE.nextInt();
          if (Productid < 0 || Productid > 10)
            throw new IllegalArgumentException();
          System.out.println(
              "You entered: " + Productid); // if try block has no error, this will print
        }
        // The code within the catch block will be run if the try block has any error
        catch (IllegalArgumentException i) {
          System.out.println(
              "Invalid Entry Detected!. Do you want to try it again?"); // if try block had an
                                                                        // error, this would print
          AddProduct = nxtLINE.next();
          if (AddProduct.equalsIgnoreCase("AddProduct"))
            execute(AddProduct);
        }
      }
    }
  }
}

輸出:

嘗試使用 java Scanner 捕獲非法引數異常

作者: Sarwan Soomro
Sarwan Soomro avatar Sarwan Soomro avatar

Sarwan Soomro is a freelance software engineer and an expert technical writer who loves writing and coding. He has 5 years of web development and 3 years of professional writing experience, and an MSs in computer science. In addition, he has numerous professional qualifications in the cloud, database, desktop, and online technologies. And has developed multi-technology programming guides for beginners and published many tech articles.

LinkedIn

相關文章 - Java Exception