【问题标题】:"Name" class nullpointerexception; attempting to rework code [duplicate]“名称”类空指针异常;试图返工代码[重复]
【发布时间】:2016-06-17 16:29:15
【问题描述】:

我查看了“什么是 NullPointerException 以及如何解决它?”,尽管这个问题及其答案根本没有帮助。我理解我的问题; “NameTest”程序试图在“Name”对象为空时引用它,但我不确定如何修改它来解决这个问题,因为我希望所有“Name”都可以访问 lastName、firstName 和 fullName方法。在“Name”程序中,我试图创建一个“Name”类,可以使用它创建一个空白名称对象,然后使用 setName() 方法分配一个 String/Stringbuffer 值(取决于哪个更好) .这是“名称”代码:

public class Name
{
private StringBuffer lastName;
private StringBuffer firstName;
private StringBuffer fullName;

public Name()
{
    lastName.replace( 0, 0, "" );
    firstName.replace( 0, 0, "" );
    fullName.replace( 0, 0, "" );
}

public Name( String lN, String fiN )
{
     lastName.replace( 0, lN.length() - 1, lN );

     firstName.replace( 0, fiN.length() - 1, fiN );     

     fullName.replace( 0, (lastName.length() + firstName.length()) + 2, lastName + ", " + firstName);
}

public Name( String fuN )
{
    String[] fuNTemp = fuN.split( ", " );
    lastName.replace( 0, fuNTemp[0].length() - 1, fuNTemp[0] );
    firstName.replace( 0, fuNTemp[1].length() - 1, fuNTemp[1] );

    fullName.replace( 0, (lastName.length() + firstName.length()) + 2, lastName + ", " + firstName);
}

public void setName( String n )
{
    String[] nTemp = n.split( ", " );
    lastName.replace( 0, nTemp[0].length() - 1, nTemp[0] );
    firstName.replace( 0, nTemp[1].length() - 1, nTemp[1] );

    fullName.replace( 0, (lastName.length() + firstName.length()) + 2, lastName + ", " + firstName);
}

public void setName( String lN, String fiN )
{
    lastName.equals( lN );
    firstName.equals( fiN );

    fullName.equals( lastName + ", " + firstName );
} 

public StringBuffer getName()
{
    return fullName;
}
}

这是程序“NameTest”,我创建它只是为了帮助找出“Name”:

public class NameTest
{
public static void main( String [] args )
{
    Name test = new Name();

    System.out.println( test.getName() );
    System.out.println();

    String Doe = new String( "Doe" );
    String John = new String( "John" );

    test.setName( Doe, John );

    System.out.println( test.getName() );
}
}

这是来自“NameTest”的错误消息:

Exception in thread "main" java.lang.NullPointerException
    at Name.<init>(Name.java:9)
    at NameTest.main(NameTest.java:5)

【问题讨论】:

  • 在使用之前初始化(分配有效对象)lastNamefirstNamefullName
  • MikeCAT,能否说得更具体一点,好吗?如,我应该将它们初始化为什么?

标签: java class nullpointerexception stringbuffer


【解决方案1】:

Name 类中的 NullPointerException 正在发生,因为当它的值为 null 时,您正试图访问它。该值为null,因为这是非原始变量类型的默认值。 N K Raju 在他的 Google 网站上的数据类型方面有很好的 tutorial

要解决您的问题,请在构造函数中使用 lastNamefirstNamefullName 变量之前对其进行初始化。

不带参数的示例:

public Name() {
    lastName = new StringBuffer();
    firstName = new StringBuffer();
    fullName = new StringBuffer();
}

带参数的示例:

public Name(String lN, String fiN) {
   lastName = new StringBuffer(lN);
   firstName = new StringBuffer(fiN);
   fullName = new StringBuffer(lN + ", " + fiN);
}

【讨论】:

  • 我不会在方法之外初始化它们,以便它们可以在所有方法中使用吗?这就是我所做的,尽管“替换”部分现在不起作用。
  • 如果您在构造函数中初始化它们,那么您可以完全跳过“替换部分”。看StringBuffer(String str)
  • test.getName() 没有返回“Doe John”的原因是因为在setName(String lN, String fiN) 方法中,您正在使用equals() 方法来检查两个Objects 之间的相等性,并且不会更改 Objects 的值。
  • 啊,好的。那么最好使用replace()吗?还是其他一些方法,例如插入?
  • replace() 可能是最好的,因为如果您使用insert(),则必须先删除StringBuilder 的所有内容。
【解决方案2】:

您尚未初始化 StringBuffer 变量的值。默认它将具有空值,并且在构造函数中您尝试用字符串“”替换空值。这会导致 NullPointerException。

初始化您的 StringBuffer 变量。

private StringBuffer lastName=new StringBuffer("lastName");
private StringBuffer firstName=new StringBuffer("firstName");
private StringBuffer fullName=new StringBuffer("fullName");

【讨论】:

  • 谢谢,这有帮助,虽然现在它只输出:“fullname”然后是“fullname”
  • 如果我的理解是正确的,那么您正在尝试将 Fullname 打印为“Doe John”。如果要赋值,为什么要比较两个字符串。
  • 我实际上是在尝试打印“Doe, John”,因为这似乎是名称通常输入数据库的方式,尽管我很可能忘记了逗号和空格之类的东西。
  • 试试下面的代码 public void setName( String lN, String fiN ) { lastName = new StringBuffer(lN); firstName = new StringBuffer(fiN); fullName = fullName.append(lastName).append(firstName); }
  • 这有帮助,谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2016-04-28
相关资源
最近更新 更多