在 Java 中测试时出现空指针异常
Posted
技术标签:
【中文标题】在 Java 中测试时出现空指针异常【英文标题】:Null pointer exception when testing in Java 【发布时间】:2011-10-15 21:56:12 【问题描述】:public boolean isItMyName(String name)
name = fullname.substring(0,fullname.indexOf(' '));
...
然后我的代码继续运行。当我运行它时,我得到一个空指针异常并且错误指向这一行。
我还创建了一个 JUnit 测试器,用于测试输入是真还是假。
Name myName = new Name();
assertEquals(false, myName.isItMyName("Troll");
它还在assertEquals(false, myName.isItMyName("Troll"));
处给了我一个空指针异常
我已经束手无策了。我该如何解决?
@格雷格·休吉尔:
在我的 Name 类中,我这样做:
public class Name(String n)
name = n;
但是在我的 main 方法中,我传入了字符串:Name myName = new Name("Johnathy");
所以字符串不为空。
全名:
public class EmailAddress
private String address;
public EmailAddress(String a)
address = a;
public String toString()
return address;
【问题讨论】:
变量/字段“全名”的值是多少?可能是空的吗? 嗯,看起来您在这一行中使用的fullname
变量为空。所以问题是:你在哪里初始化这个变量,而不是它的默认值 null?
你确定fullname
不是null
?
@MacosxIam:您确实意识到您在main
方法中创建的对象与您在单元测试中创建的对象不同?跨度>
现在你已经显着改变了你的问题,在不同的情况下调用了两个不同的Name
构造函数,并为EmailAddress
引入了看起来不相关的代码。恐怕我现在迷路了。
【参考方案1】:
好吧,您忽略了您的参数...您在第一行为name
分配了一个新值。这意味着您的方法几乎肯定一开始就被破坏了。
然后考虑fullname
(我假设它是一个实例变量)将来自哪里。除非您在无参数构造函数中将其设置为一个值,否则默认情况下它将为 null
。这真的是你想要的吗?
我建议您将Name
类更改为仅 具有采用名称参数的构造函数,并且您验证它们不为空。这样你就永远不会有一个无效的Name
对象,其中全名是null
。
编辑:现在您已经发布了更多代码,请查看您的无参数构造函数和 setName
方法:
public Name()
setName(fullname);
public void setName(String n)
fullname = n;
这意味着你的无参数构造函数相当于:
public Name()
fullname = fullname;
... 即无操作。 fullname
将为空,因此异常。
我的建议是完全摆脱无参数构造函数,让另一个验证参数。
【讨论】:
但是我不只是定义什么名字吗?这就是我想做的。 @MacosxIam:不,您已经将name
声明为该方法的参数。所以在执行该方法的第一行之前,name
的值将是对“Troll”的引用。然后,您尝试将值设置为 不同的 值(fullName
的子字符串)。即使在您解决空引用问题之前,也可能值得在您正在学习的任何书籍/教程中查看参数。
我删除了参数并使用这些指令(子字符串)创建了一个字符串。仍然是空指针异常。这意味着参数与错误无关。
@MacosxIam:不,它们与错误无关 - 这是由于fullname
造成的,我的其余答案都与此有关。但是了解参数问题也是至关重要的。
@MacosxIam:编辑了有关当前代码中发生的事情的更多详细信息。【参考方案2】:
name = fullname.substring(0,fullname.indexOf(' '));
如果您在该行上遇到空指针异常,则 fullname
是 null
。这真的是唯一的可能。
【讨论】:
@MacosxIam:是的,但字符串可以是null
,尤其是在您没有为其分配任何其他内容的情况下。从您发布的代码来看,您似乎还有一些练习要做。祝你好运,使用调试器,继续提问!
Nit: A String 不能为空...字符串类型表达式的评估可能会导致空值,但仍然是 +1。重力存在。 ;-)
@MacosxIam:这不是您在原始问题中显示的内容,您的 JUnit 测试人员在其中执行 Name myName = new Name();
(使用无参数构造函数)。无参数构造函数采用fullname
的值(即null
,因为它就是这样开始的),调用setName(null)
,它分配fullname = null
。在这种情况下,这是一种无所作为的迂回方式。也许您可以在无参数构造函数中使用 fullname = ""
,因此 fullname
以空字符串而不是 null
开始。【参考方案3】:
如果没有更多代码,我不能肯定地说,但我敢打赌fullname
是 null 并且永远不会设置任何内容。
【讨论】:
【参考方案4】:如果在全名中没有找到''索引,它不会返回-1,从而导致子字符串抓取为空的0,-1...如果索引
【讨论】:
实际上,在这种情况下,substring() 会抛出一个StringIndexOutOfBoundsException
。你不会看到 NPE。以上是关于在 Java 中测试时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章