有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么显示NullPointerException?

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

java。lang.NullPointerException 登记时。学生。nextUserName(Students.java:149) 在ui上。我是个学生。提交(AddStudent.java:254) 在ui上。我是个学生。jButton1ActionPerformed(AddStudent.java:186) 在ui上。我是个学生。访问$000(AddStudent.java:24) 在ui上。加学生1美元。执行的操作(AddStudent.java:76) 在javax。摆动抽象按钮。fireActionPerformed(AbstractButton.java:1995) 在javax。摆动AbstractButton$Handler。actionPerformed(AbstractButton.java:2318) 在javax。摆动DefaultButtonModel。fireActionPerformed(DefaultButtonModel.java:387) 在javax。摆动DefaultButtonModel。setPressed(DefaultButtonModel.java:242) 在javax。摆动普拉夫。基本的基本按钮列表。鼠标释放(BasicButtonListener.java:236) 在爪哇。awt。组成部分ProcessMouseeEvent(Component.java:6038) 在javax。摆动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而不是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();
}

共 (3) 个答案

  1. # 1 楼答案

    它显示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是否为空,但我认为您并没有真正考虑到潜在的问题。一个新的系统管理应该为你的用户名和姓氏提供什么?除了空值,它们还会是其他的吗

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

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

    (有一天,你可能会遇到一个由外部因素引起的问题。有缺陷的编译器、糟糕的RAM、糟糕的实现规范等等。今天不是这一天。如果你怀疑其中任何一个问题,请确保你首先彻底排除了这是你自己的错误的可能性。)

  2. # 2 楼答案

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

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

  3. # 3 楼答案

    当创建一个新的系统管理时,它会返回什么

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