在Java中测试时出现空指针异常
然后我的代码就一直在写。当我运行它时,我得到一个空指针异常,错误指向这一行 我还创建了一个JUnit测试仪,它测试输入是真是假在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”))处给我一个空指针异常
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的子字符串)。在您学习的任何书籍/教程中,甚至在您解决空引用问题之前,都值得检查参数