2009-11-25 74 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

相关问题