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();
}
# 1 楼答案
它显示
NullPointerException
,因为第149行有一个空指针。我不知道哪一个是第149行,所以让我们考虑一下选项:不可能是那条线。它正在创建一个新对象
也不可能是那条线,因为同样的原因。(尽管我很困惑什么是系统管理,为什么“学生”会是这样一个对象的好名字。)
不可能是那条线。我们已经知道
students
不能为null(否则前一行会抛出不同的异常,而不允许执行到达这一行)也许是那个。使用调试器检查
name1
的值。它是空的吗?你希望一个全新的管理系统给你起什么名字不可能是那个
也许是那个你对全新的管理系统有什么期待
不可能是这个。如果这两个字符串变量中的任何一个为null,那么在调用
charAt
时,您会在更早的时候得到异常该行之后的所有内容要么使用两个字符串对象,要么使用新创建的对象,因此我们可以不考虑该方法的其余部分。把你的注意力集中在我指出的两行上(或者你知道的那一行是149行)
在使用它们之前,您已经更改了代码,以检查
name1
和family1
是否为空,但我认为您并没有真正考虑到潜在的问题。一个新的系统管理应该为你的用户名和姓氏提供什么?除了空值,它们还会是其他的吗显然,这些值中的一个或两个都为null,因此您可以跳过方法中的所有其他值,直到最后一行,在那里调用
getUserName
。既然跳过了对setUserName
的调用,那么getUserName
应该返回什么值呢?(如果你不知道,去看看。)当你问“我的程序为什么做X?”用另一个问题回答:“为什么不应该它做X?”你是编写代码的人,所以程序最终会完全按照你的要求执行。如果它没有达到你的预期,那么你给了它错误的指示。检查你的代码,如果必须的话,一次一行,找出哪里出了问题。确保你完全理解每一行代码的作用。如果你有一句台词,但你不明白,去阅读文档,询问你的导师,或者在这里询问。在纸上浏览执行过程,跟踪每个变量的值,并在重新分配时划掉旧值。如果一个类有多个实例,请确保在任何给定的时间跟踪正在使用的实例
(有一天,你可能会遇到一个由外部因素引起的问题。有缺陷的编译器、糟糕的RAM、糟糕的实现规范等等。今天不是这一天。如果你怀疑其中任何一个问题,请确保你首先彻底排除了这是你自己的错误的可能性。)
# 2 楼答案
异常消息显示,在
Students.java
的第149行的某处(在nextUserName()
方法的某处),您试图访问null
对象的属性或方法。例如,如果students.getName();
返回null
,那么当您尝试调用chatAt()
时,下一行将出现此异常如果没有
SystemManagement
的来源,很难深入了解更多细节,但是如果你找到哪一行是149,你应该能够追溯到null
的来源# 3 楼答案
当创建一个新的系统管理时,它会返回什么
空值在
nextUserName
方法的第3行或第4行,请检查=开始前为空