Java 空指针异常错误,不确定原因

Java 空指针异常错误,不确定原因,java,string,nullpointerexception,Java,String,Nullpointerexception,所以我必须创建一个方法,将输入字符串分为名字/中间名/姓氏,计算创建的“学生”的数量,等等,然后我必须创建一个类来测试这些方法 public void setName(String newName) { String[] nameInput = newName.split(" "); if(nameInput.length == 0) { System.out.println("Error, please enter at least two names.

所以我必须创建一个方法,将输入字符串分为名字/中间名/姓氏,计算创建的“学生”的数量,等等,然后我必须创建一个类来测试这些方法

public void setName(String newName)
{
    String[] nameInput = newName.split(" ");
    if(nameInput.length == 0)
    {
        System.out.println("Error, please enter at least two names.");
        newName = null;
    }
    else if(nameInput.length == 1)
    {
        firstName = nameInput[0];
        middleName = "";
        lastName = nameInput[1];
        newName = firstName +  lastName;
    }
    else if(nameInput.length == 2)
    {
        firstName = nameInput[0];
        middleName = nameInput[1];
        lastName = nameInput[2];
        newName = firstName + middleName + lastName;

    }

    else
    {
        System.out.println("Error! You can only enter up to three names.");

    }
}
public String getName()
{
    if (middleName == null)
    {
        return firstName + " " + lastName;
    }
    else
        return firstName + " " + middleName + " " + lastName;
}

public String getId()
{
    return identifier = generateID();
}

@Override

public String toString()
{
    return getName() + "\n" + "(" + generateID() + ")";
}


private String generateID()
{
    return UUID.randomUUID().toString();
}
这就是我测试代码的方式:

public static void testStudent()
{
    System.out.println("Trying to create testStudent1 with a single name...");
    testStudent1 = new Student("A");
    System.out.println("testStudent1.toString() is " + testStudent1.toString());
    System.out.println("testStudent1.getFirstName() is " + testStudent1.getFirstName());
    System.out.println("testStudent1.getMiddleName() is " + testStudent1.getMiddleName());
    System.out.println("testStudent1.getLastName() is " + testStudent1.getLastName());

    System.out.println("Trying to create testStudent2 with two names...");
    testStudent1 = new Student("A B");
    System.out.println("testStudent2.toString() is " + testStudent2.toString());
    System.out.println("testStudent2.getFirstName() is " + testStudent2.getFirstName());
    System.out.println("testStudent2.getMiddleName() is " + testStudent2.getMiddleName());
    System.out.println("testStudent2.getLastName() is " + testStudent2.getLastName());

    System.out.println("Trying to create testStudent3 with three names...");
    testStudent1 = new Student("A B C");
    System.out.println("testStudent3.toString() is " + testStudent3.toString());
    System.out.println("testStudent3.getFirstName() is " + testStudent3.getFirstName());
    System.out.println("testStudent3.getMiddleName() is " + testStudent3.getMiddleName());
    System.out.println("testStudent3.getLastName() is " + testStudent3.getLastName());
}

当它为一个有两个名字的学生测试toString时,我一直遇到空指针异常,我不知道为什么

编辑:问题在于
testStudent()
方法中的
testStudent
变量

System.out.println("Trying to create testStudent1 with a single name...");
testStudent1 = new Student("A");
System.out.println("testStudent1.toString() is " + testStudent1.toString());
System.out.println("testStudent1.getFirstName() is " + testStudent1.getFirstName());
System.out.println("testStudent1.getMiddleName() is " + testStudent1.getMiddleName());
System.out.println("testStudent1.getLastName() is " + testStudent1.getLastName());

System.out.println("Trying to create testStudent2 with two names...");
Student testStudent2 = new Student("A B");
System.out.println("testStudent2.toString() is " + testStudent2.toString());
System.out.println("testStudent2.getFirstName() is " + testStudent2.getFirstName());
System.out.println("testStudent2.getMiddleName() is " + testStudent2.getMiddleName());
System.out.println("testStudent2.getLastName() is " + testStudent2.getLastName());

System.out.println("Trying to create testStudent3 with three names...");
Student testStudent3 = new Student("A B C");
System.out.println("testStudent3.toString() is " + testStudent3.toString());
System.out.println("testStudent3.getFirstName() is " + testStudent3.getFirstName());
System.out.println("testStudent3.getMiddleName() is " + testStudent3.getMiddleName());
System.out.println("testStudent3.getLastName() is " + testStudent3.getLastName());
由于您正在使用
testStudent1
变量来创建
Student
类的新对象,并且没有使用它们来调用getter函数,因此它将为
testStudent2
testStudent3
变量抛出NPE。
旧问题的答案:问题在于您的
while
声明。它永远不会停止

您只需对字符串数组执行
nameInput.length
,即可找到计数

应该是这样的:

String[] nameInput = newName.split(" ");
if (nameInput.length == 1)
{
   System.out.println("Error, please enter at least two names.");
   newName = null;
}
else if (nameInput.length == 2)
{ 
  ...
}
else if (nameInput.length == 3)
{ 
  ...
}
else 
{
  ...
}

您可以使用
StringTokenizer
类来帮助您实现这一点

import java.util.StringTokenizer
StringTokenizer test = new StringTokenizer("An example string");
while (test.hasMoreTokens()) {
   System.out.println(test.nextToken());
}
输出:

An
example
string.
countTokens()
方法可以提供一个字符串将提供多少令牌来进行预先处理。这样,您就可以知道是否有中间名。

请检查trim()方法


这可能只是一个类赋值,但请仔细想想:这个
while(i
永远不会停止,因为
i
永远不会递增。我尝试了您发送的代码,但当我只输入一个名称时,我会得到一个空指针exception@Anonymous,您可以。@Anonymous:去掉
i
变量。你能发布你的代码吗?我很惊讶,如果您输入一个名称,它将返回1。@匿名:现在问题是字符串数组
nameInput[1]
的索引。索引应始终以0开头。应该是这样的:
firstName=nameInput[0]
middleName=nameInput[1]
lastName=nameInput[2]@Anonymous:请找到我的代码编辑。
if
条件以
if(nameInput.length==1)
public static void getName(String newName) {
        newName = newName.trim();
        String fullName = null;
        String[] nameInput = newName.split(" ");
        switch (nameInput.length) {
        case 2:
            fullName = mergeName(nameInput[0], "", nameInput[1]);
            break;
        case 3:
            fullName = mergeName(nameInput[0], nameInput[1], nameInput[2]);
            break;
        default:
            System.out.println("Error, please enter at least two names.");
            break;
        }
        System.out.println(fullName);
    }

    public static String mergeName(String firstName, String middleName,
            String lastName) {
        String name = firstName+" " + middleName+" " + lastName;
        return name;
    }