2009-11-25 115 views
-2

我有一個對象,這是學生的學生;其中有一些字段如姓名,家庭......我想爲這個學生創建一個用戶名,並通過點擊一個按鈕,我想在控制檯上顯示學生的用戶名,但它會在控制檯上顯示這些句子(我複製並粘貼僅有的那部分)----->它爲什麼顯示NullPointerException?

顯示java.lang.NullPointerException 在registration.Students.nextUserName(Students.java:149) 在ui.AddStudent.submit( AddStudent.java:254) at ui.AddStudent.jButton1ActionPerformed(AddStudent.java:186) at ui.AddStudent.access $ 000(AddStudent.java:24) at ui.AddStudent $ 1.actionPerformed(AddStudent.java:76) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:19 95) 在javax.swing.AbstractButton中的$ Handler.actionPerformed(AbstractButton.java:2318) 在javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 在javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java: (javax.swing.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6038) at javax.swing.JComponent.processMouseEvent(JComponent。 java:3265) 。 。 。

我的學生類的一部分,這也延伸人:

public String nextUserName() { 
    StringBuffer user = new StringBuffer(); 
    SystemManagement students = new SystemManagement(); 
    String name1 = students.getName(); 
    char char1 = name1.charAt(0); 
    String family1 = students.getFamily(); 
    char char2 = family1.charAt(1); 
    setUserName(name1 + "." + family1); 
    if (user.length() != 0 && user.toString().equals(getUserName())) { 
     char[] allowedCharacters1 = {char1, char2, '1', '.'}; 
     SecureRandom random = new SecureRandom(); 

     for (int i = 0; i < user.length(); i++) { 
      user.append(allowedCharacters1[random.nextInt(allowedCharacters1.length)]); 
     } 
     setUserName(user.toString()); 
    } 

    return getUserName(); 

} 

public String currentUserName() { 
    return getUserName(); 
} 

public static Students getInstance() { 
    if (instance == null) { 
     instance = new Students(); 
    } 
    return instance; 
} 

我的人等級:

private String userName; 

public Human(String userName) { 

    this.userName = Students.getInstance().nextUserName(); 
} 

public void setUserName(String userName) { 

    this.userName = userName; 
} 

public String getUserName() { 
    return userName; 
} 

謝謝,我已經改變了我netUserName()方法,這一點,但它返回NULL,而不是例外。

public String nextUserName() { 
    StringBuffer user = new StringBuffer(); 
    SystemManagement students = new SystemManagement(); 
    String name1 = students.getName(); 
    String family1 = students.getFamily(); 
    if(name1 !=null && family1 !=null) { 
    char char1 = name1.charAt(0); 
    char char2 = family1.charAt(1); 
    setUserName(name1 + "." + family1); 
    if (user.length() != 0 && user.toString().equals(getUserName())) { 
     char[] allowedCharacters1 = {char1, char2, '1', '.'}; 
     SecureRandom random = new SecureRandom(); 
     for (int i = 0; i < user.length(); i++) { 
     user.append(allowedCharacters1[random.nextInt(allowedCharacters1.length)]); 
     } 
     setUserName(user.toString()); 
    } 
    } 
    return getUserName(); 
} 
+0

哪一行會引發空指針? – 2009-11-25 05:50:37

+1

@Johanna - 您一直在使用Java ...和SO ...足夠長的時間,以至於您不再需要提醒您包含堆棧跟蹤和相關行號。讓你的行爲一起好友! – 2009-11-25 06:11:14

回答

0

當創建新的SystemManagment時,它究竟返回什麼?

null爲nextUserName方法的第3行或第4行,在開始之前檢查!= null。

0

異常消息顯示在Students.java(它在nextUserName()方法中的某處)的第149行的某處,您試圖訪問對象的屬性或方法。例如,如果students.getName();返回null,那麼當您嘗試對其調用chatAt()時,您將在下一行中得到此例外。

沒有SystemManagement的來源很難進入更多的細節,但如果你找到哪一行是149你應該能夠追溯到null來自哪裏。

10

這表明NullPointerException因爲你對線149空指針,我不知道哪一個是線149,所以讓我們考慮的選項:

StringBuffer user = new StringBuffer(); 

不能說行。它創造了一個新的對象。

SystemManagement students = new SystemManagement(); 

由於相同的原因,不能是該行。 (雖然我很困惑系統管理是什麼,爲什麼「學生」會成爲這樣一個對象的好名字。)

String name1 = students.getName(); 

不能是那條線。我們已經知道students不能爲null(否則前一行將拋出不同的異常而不允許執行到達此行)。

char char1 = name1.charAt(0); 

也許那一個。使用您的調試器檢查name1的值。它是否爲空? 希望能從全新的系統管理中獲得什麼名字?

String family1 = students.getFamily(); 

不能是那一個。

char char2 = family1.charAt(1); 

也許這一個。您對全新的系統管理有何期望?

setUserName(name1 + "." + family1); 

不能是這一個。如果這兩個字符串變量中的任何一個都爲null,那麼在您之前調用charAt時,您會早先得到例外。

該行之後的所有內容都使用了兩個字符串對象,或者它使用了新創建的對象,因此我們可以從考慮中消除其餘的方法。把注意力集中在我指出的兩條線上(或者你在知道的行是149行)。


你已經改變了你的代碼檢查name1family1不是空然後再使用它們,但我不認爲你真的認爲根本問題。什麼是新的SystemManagement 假設給你的用戶名和姓氏?他們會是什麼其他比空?

顯然,這些值中的一個或兩個都是空值,因此您可以跳過方法中的所有其他操作,直到最後一行,您可以撥打getUserName。既然你已經跳過setUserName,那麼getUserName應該返回什麼值呢? (如果你不知道,請去找出。)

當你問「爲什麼我的程序要做X?」回答另一個問題:「爲什麼不應該它做X?」你是編寫代碼的人,所以程序最終會按照你說的去做。如果它沒有達到你的預期,那麼你給了它錯誤的指示。仔細檢查你的代碼,如果你需要的話,一次一行,並找出出錯的地方。確保你完全理解你的代碼的每一行都會做什麼。如果你有一條線路但你不理解它,請閱讀文檔,詢問你的教練,或者在這裏問問。在紙上中執行,跟蹤每個變量的值,並在重新分配舊值時將其刪除。如果你有一個類的多個實例,請確保你在任何給定的時間跟蹤你正在使用哪個實例。 (有一天,你可能會遇到一個問題,這是由於外部因素造成的,一個有問題的編譯器,壞RAM,執行不當的規範等等。今天不是那一天。如果您懷疑其中的任何一種,請確保您首先徹底排除了將其作爲您自己的錯誤的可能性。)

+0

+1比我的回答更徹底 – Kieron 2009-11-25 06:00:59

+0

有多少人缺乏最簡單的調試技巧,真是令人驚訝。 +1。 – Bombe 2009-11-25 08:31:57

+1

+1對於某一天,你可能...... – 2009-11-25 08:49:56

相關問題