Java 为什么它显示NullPointerException?

Java 为什么它显示NullPointerException?,java,Java,我有一个对象是学生;其中有一些字段,如姓名、家庭等,。。。我想为这个学生创建一个用户名,通过点击一个按钮,我想在控制台上显示学生的用户名,但它会在控制台上显示这些句子(我只复制并粘贴了其中的一部分)---> java.lang.NullPointerException 在registration.Students.nextUserName(Students.java:149) 在ui.AddStudent.submit(AddStudent.java:254)中 在ui.AddStudent.j

我有一个对象是学生;其中有一些字段,如姓名、家庭等,。。。我想为这个学生创建一个用户名,通过点击一个按钮,我想在控制台上显示学生的用户名,但它会在控制台上显示这些句子(我只复制并粘贴了其中的一部分)--->

java.lang.NullPointerException 在registration.Students.nextUserName(Students.java:149) 在ui.AddStudent.submit(AddStudent.java:254)中 在ui.AddStudent.jButton1ActionPerformed处(AddStudent.java:186) 在ui.AddStudent.access$000(AddStudent.java:24) 在ui.AddStudent$1.actionPerformed处(AddStudent.java:76) 在javax.swing.AbstractButton.fireActionPerformed上(AbstractButton.java:1995) 位于javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) 在javax.swing.DefaultButtonModel.fireActionPerformed上(DefaultButtonModel.java:387) 在javax.swing.DefaultButtonModel.setPressed中(DefaultButtonModel.java:242) 在javax.swing.plaf.basic.BasicButtonListener.mouseRelease(BasicButtonListener.java:236) 位于java.awt.Component.ProcessMouseeEvent(Component.java:6038) 位于javax.swing.JComponent.ProcessMouseeEvent(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;
}
谢谢,我已将我的netUserName()方法更改为此,但它返回null而不是exception

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();
}
公共字符串nextUserName(){
StringBuffer用户=新建StringBuffer();
系统管理学生=新系统管理();
字符串名称1=students.getName();
字符串family1=students.getFamily();
if(name1!=null&&family1!=null){
char char1=name1.charAt(0);
char char2=家庭1.charAt(1);
setUserName(名称1+“+”家族1);
如果(user.length()!=0&&user.toString().equals(getUserName())){
char[]allowedCharacters1={char1,char2,'1','.';
SecureRandom=新的SecureRandom();
for(int i=0;i
创建新的系统管理时,它会准确返回什么


空值位于
nextUserName
方法的第3行或第4行,请检查=开始前为空。

异常消息显示
Students.java
第149行的某个地方(在
nextUserName()
方法的某个地方)您正试图访问
null
对象的属性或方法。例如,如果
students.getName()
返回
null
,然后在下一行尝试调用
chatAt()
时会出现此异常


如果没有
SystemManagement
的源代码,很难深入了解更多细节,但是如果您找到哪一行是149,您应该能够追溯
null
的来源。

它显示
NullPointerException
,因为第149行上有一个null指针。我不知道哪一个是第149行,所以让我们考虑一下选项:

StringBuffer user = new StringBuffer();
不可能是那条线。它正在创建一个新对象

SystemManagement students = new SystemManagement();
也不可能是那条线,因为同样的原因。(尽管我很困惑什么是系统管理,为什么“学生”会是这样一个对象的好名字。)

不可能是那条线。我们已经知道
students
不能为null(否则前一行将抛出不同的异常,而不允许执行到达此行)

也许是那个。使用调试器检查
name1
的值。它是空的吗?您希望从全新的系统管理中获得什么名称

String family1 = students.getFamily();
setUserName(name1 + "." + family1);
不可能是那个

char char2 = family1.charAt(1);
可能就是这个。您希望从全新的系统管理中获得什么样的家族

String family1 = students.getFamily();
setUserName(name1 + "." + family1);
不可能是这个。如果这两个字符串变量中的任何一个为null,那么在调用它们的
charAt
时,您会得到异常

该行之后的所有内容要么使用两个字符串对象,要么使用新创建的对象,因此我们可以不考虑该方法的其余部分。把你的注意力集中在我指出的两行(或者你知道的第149行)


在使用之前,您已经更改了代码,以检查
name1
family1
是否为空,但我认为您没有真正考虑到潜在的问题。对于用户名和姓氏,新的系统管理应该为您提供什么?它们将永远是空的以外的任何东西吗

显然,这些值中的一个或两个都为null,因此您将跳过方法中的所有其他值,直到最后一行,在该行中调用
getUserName
。既然您跳过了对
setUserName
的调用,
getUserName
应该返回什么值?(如果你不知道,去查一查。)

当你问“为什么我的程序做X?”时,用另一个问题回答:“为什么它不应该做X?”你是编写代码的人,所以程序最终完全按照你告诉它的去做。如果它没有达到你的预期,那么你给了它错误的指示。检查你的代码,如果有必要的话,一次一行,找出哪里出了问题。确保您完全理解代码的每一行将要做什么。如果你有一行不懂的话,去阅读文档,询问你的导师,或者在这里询问。在纸上遍历执行过程,跟踪每个变量的值,并在重新赋值时划掉旧值。如果您有一个类的多个实例,请确保在任何给定时间跟踪您正在使用的实例

(有一天,你可能会遇到一个由外部因素引起的问题。一个有缺陷的编译器、糟糕的RAM、糟糕的实现规范等等。今天不是这一天。如果你怀疑其中任何一个,mak
setUserName(name1 + "." + family1);