在Java中测试时出现空指针异常

在Java中测试时出现空指针异常,java,string,netbeans,nullpointerexception,Java,String,Netbeans,Nullpointerexception,然后我的代码就一直在写。当我运行它时,我得到一个空指针异常,错误指向这一行 我还创建了一个JUnit测试仪,它测试输入是真是假 public boolean isItMyName(String name) { name = fullname.substring(0,fullname.indexOf(' ')); ... } 它还在assertEquals(false,myName.isItMyName(“Troll”))处给我一个空指针异常

然后我的代码就一直在写。当我运行它时,我得到一个空指针异常,错误指向这一行

我还创建了一个JUnit测试仪,它测试输入是真是假

public boolean isItMyName(String name)
    {    
       name = fullname.substring(0,fullname.indexOf(' '));
       ...
    }
它还在
assertEquals(false,myName.isItMyName(“Troll”))处给我一个空指针异常

我束手无策。我该如何解决这个问题

@格雷格·休吉尔:

在my Name类中,我执行以下操作:

Name myName = new Name();
assertEquals(false, myName.isItMyName("Troll");
但是在我的main方法中,我传入字符串:Name myName=newname(“Johnathy”)

所以字符串不是空的

全名:

public class Name(String n)
{
  name = n;
}

如果没有更多的代码,我不能确定,但我打赌您的
fullname
为null,并且从未设置任何值。

如果没有更多的代码,我不能确定,但是我打赌您的
fullname
为null,并且从未设置任何值。

您忽略了您的参数。。。您正在为第一行中的
name
指定一个新值。这意味着你的方法一开始几乎肯定是失败的

然后考虑<代码>全名< /代码>(我假设它是一个实例变量)将来自哪里。除非将其设置为无参数构造函数中的值,否则默认情况下它将为

null
。这真的是你想要的吗

我建议您将
Name
类更改为仅让构造函数使用Name参数,并验证它们是否为null。这样,您就永远不会有一个无效的
名称
对象,其中全名为
null

编辑:现在您发布了更多代码,请查看无参数构造函数和
setName
方法:

public class EmailAddress {
private String address;



public EmailAddress(String a)
{
  address = a;

}

public String toString()
{
    return address;
}
这意味着您的无参数构造函数等效于:

public Name()
{
   setName(fullname);     
}

public void setName(String n)
{
    fullname = n;
}
。。。i、 e.序号
全名
将为空,因此例外


我的建议是完全去掉无参数构造函数,让另一个构造函数验证参数。

你忽略了你的参数。。。您正在为第一行中的
name
指定一个新值。这意味着你的方法一开始几乎肯定是失败的

public Name()
{
   fullname = fullname;
}

然后考虑<代码>全名< /代码>(我假设它是一个实例变量)将来自哪里。除非将其设置为无参数构造函数中的值,否则默认情况下它将为

null
。这真的是你想要的吗

我建议您将
Name
类更改为仅让构造函数使用Name参数,并验证它们是否为null。这样,您就永远不会有一个无效的
名称
对象,其中全名为
null

编辑:现在您发布了更多代码,请查看无参数构造函数和
setName
方法:

public class EmailAddress {
private String address;



public EmailAddress(String a)
{
  address = a;

}

public String toString()
{
    return address;
}
这意味着您的无参数构造函数等效于:

public Name()
{
   setName(fullname);     
}

public void setName(String n)
{
    fullname = n;
}
。。。i、 e.序号
全名
将为空,因此例外

我的建议是完全去掉无参数构造函数,让另一个构造函数验证参数

public Name()
{
   fullname = fullname;
}
如果在该行上出现空指针异常,则
fullname
null
。这真的是唯一的可能


如果在该行上出现空指针异常,则
fullname
null
。这确实是唯一的可能性。

如果在全名中找不到“”索引,它不会返回-1,从而导致子字符串获取0,-1,该值为空。。。如果索引小于0,则可能将其放入if并跳过该步骤。。。如果在全名中找不到“”索引,则不返回-1,从而导致子字符串获取0,-1,该值为空。。。如果索引小于0,则可能将其放入if并跳过该步骤。。。输入的参数不应该是fullname

变量/字段“fullname”的值是多少?它可能是空的吗?看起来您在此行中使用的
fullname
变量是空的。所以问题是:你在哪里初始化这个变量,而不是它的默认值null?你确定
fullname
不是
null
?@MacosxIam:你意识到你在
main
方法中创建的对象与你在单元测试中创建的对象不同吗?现在你已经明白了更改了您的问题,在不同的情况下调用了两个不同的
名称
构造函数,并引入了看起来不相关的
电子邮件地址
代码。恐怕我现在迷路了。变量/字段“fullname”的值是多少?它可能是空的吗?看起来您在此行中使用的
fullname
变量是空的。所以问题是:你在哪里初始化这个变量,而不是它的默认值null?你确定
fullname
不是
null
?@MacosxIam:你意识到你在
main
方法中创建的对象与你在单元测试中创建的对象不同吗?现在你已经明白了更改了您的问题,在不同的情况下调用了两个不同的
名称
构造函数,并引入了看起来不相关的
电子邮件地址
代码。恐怕我现在迷路了。实际上,在这种情况下,substring()会抛出一个
StringIndexOutOfBoundsException
。实际上,在这种情况下,substring()会抛出一个
StringIndexOutOfBoundsException
。你看不到NPE,但我不是在定义它的名字吗?这就是我要做的。@MacosxIam:不,您已经声明了
name
作为方法的参数。因此,在执行方法的第一行之前,
name
的值将是对“Troll”的引用。然后尝试将该值设置为其他值(fullName的子字符串)。在您学习的任何书籍/教程中,甚至在您解决空引用问题之前,都值得检查参数