在 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(' '));

如果您在该行上遇到空指针异常,则 fullnamenull。这真的是唯一的可能。

【讨论】:

@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 中测试时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

Java + Android -> 开始新活动时出现空指针异常

HomeBaseFragment 运行时出现空指针异常

使用 Java 编译器 API 时出现空指针异常

尝试开始新活动时出现空指针异常

使用 PDF 查看器库时出现空指针异常

尝试从 Apache Beam 中的选项获取值时出现空指针异常