偵錯及排解程式碼問題

透過偵錯和疑難排解,更快解決程式碼錯誤。

提示詞範例

在對話輸入框輸入提示詞,例如:

I'm getting a NullPointerException in this Java code. Can you analyze the stack
trace, identify the likely cause, and suggest a fix? Can you also help me debug
this issue by simulating different inputs?

輸出範例

Gemini Enterprise 會根據這則提示,產生類似下列內容的輸出:

沒問題!我一定能協助你解決NullPointerException問題。我們來分析問題,找出解決方案。

錯誤分析

您提供的堆疊追蹤是瞭解問題的關鍵:


  Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "User.getAddress()" is null
  at MyClass.main(MyClass.java:8)
  

各項指標的意義如下:

  1. java.lang.NullPointerException:這是錯誤。當您嘗試使用未指派給物件的參照時,就會發生這種情況,也就是說,參照指向 null。
  2. Cannot invoke "Address.getStreet()":程式因嘗試呼叫 getStreet() 方法而失敗。
  3. because the return value of "User.getAddress()" is null:這是關鍵部分。user.getAddress() 方法傳回 null,您無法對 null 參照呼叫任何方法。
  4. at MyClass.main(MyClass.java:8):錯誤發生在 MyClass.java 檔案的第 8 行,內容為:System.out.println("User's street: " + user.getAddress().getStreet());

可能原因

User 物件的 address 欄位從未初始化,因此會發生 NullPointerException。

  1. 在 MyClass.java 中,建立 User 物件:User user = new User("Alice");。
  2. User 建構函式 public User(String name) 會設定使用者的 name,但將 address 欄位保留為 null。
  3. 程式碼執行 user.getAddress() 時,會正確傳回 address 欄位的值,也就是 null。
  4. 接著,程式會嘗試對該 null 值執行 .getStreet(),導致當機。

修正建議

如要修正這個問題,請先建立 Address 物件,並與 User 物件建立關聯,再嘗試存取。

以下是修正後的 MyClass.java 檔案:


// File: MyClass.java
public class MyClass {
  public static void main(String[] args) {
    // Create a new user
    User user = new User("Alice");

    // Create and set the user's address
    Address address = new Address("123 Main St", "Anytown");
    user.setAddress(address);

    // Now, this line will work correctly
    System.out.println("User's street: " + user.getAddress().getStreet());
  }
}
  

模擬輸入內容以進行偵錯

如您所要求,我們可以模擬不同情境,瞭解如何編寫更穩健的程式碼。我會使用 Python 示範邏輯,因為這個語言很適合快速模擬。

以下模擬畫面顯示原始問題、修正方式,以及防範日後當機的防禦性檢查。