奇怪的'null'字符串作为值并使String对象不为空,为什么?

时间:2016-04-01 00:23:29

标签: java

尝试这段代码,你会看到输出,代码在一个类中使用两个String,另一个在变量中,两个用法的输出是非常不同和奇怪的,为什么以及如何解决它? / p>

---------With class...
null
null
null hello
---------With variable...
null

 hello

为名称设置null会变成String的这个值,为什么?我需要名称为null而不是'null'。

谢谢你的帮助。

//'main' method must be in a class 'Rextester'.
//Compiler version 1.8.0_72

import java.util.*;
import java.lang.*;

class Car {
   private String name;

   public void setName( String name ) { 
       if (this.validateName( name )) 
          this.name = name; 
   }

   public String getName() { return name; }

   public boolean validateName(String name) { 
      return name != null && name.trim() != ""; 
   }

   public boolean validate()
   { return this.validateName( this.name ); }
}

class Rextester
{  
    public static void main(String args[])
    {

        System.out.println( "---------With class..." );
        Car t = new Car();

        t.setName(null);
        System.out.println( t.getName() );

        t.setName("");
        System.out.println( t.getName() );

        t.setName(t.getName() + " hello" );
        System.out.println( t.getName() );     

        System.out.println( "---------With variable..." );

        String nullString = new String();

        nullString = null;
        System.out.println( nullString );

        nullString = "";
        System.out.println( nullString );

        nullString = nullString + " hello";
        System.out.println( nullString );
    }
}

5 个答案:

答案 0 :(得分:1)

你可以调用isEmpty()方法,如果name为空,它将返回true。

name.isEmpty()

答案 1 :(得分:0)

这是因为您的'validateName(String name)'方法返回'false'因此'setName(String name)'方法无法执行任何操作,而小组成员'name'仍为'null' }。

这源于'request.get parameter("name")'调用根据您的帖子返回空字符串的事实。

答案 2 :(得分:0)

也许您可以尝试将setName更改为:

   public void setName( String name ) { 
       if (this.validateName( name )) {
          this.name = name; 
       } else {
          this.name = "";
       }
   }

作为替代方案?希望它有所帮助。

答案 3 :(得分:0)

您的输出来自此声明:

System.out.println( "'" + name + "'" )

只打印字符串连接的结果,其中包含空值。

根据JLS 15.18.1 String Concatenation Operator +

  

如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(§5.1.11)以在运行时生成字符串。

JLS 5.1.11 String Conversion 说:

  

如果引用为null,则会将其转换为字符串" null" (四个ASCII字符null)。

如果您要打印不带引号的文字null,则必须不打印报价:

System.out.println( name != null ? "'" + name + "'" : "null" )

或者如果你想要像空字符串那样打印null(哑,因为那时你看不出差异):

System.out.println( "'" + (name != null ? name.toString() : "") + "'" )

不同主题上,name.trim() != ""无法正常工作。

您无法使用==!=来比较字符串。

使用! name.trim().isEmpty()

第三个注释:setName()不应该默默地忽略输入错误。

public void setName( String name ) { 
    if (this.validateName( name )) 
        this.name = name; 
}

此代码应该在输入错误时失败:

public void setName( String name ) { 
    if (! this.validateName( name ))
        throw new IllegalArgumentException("Name cannot be null or blank");
    this.name = name; 
}

或者在输入错误时指定null或空白:

public void setName( String name ) { 
    if (this.validateName( name )) 
        this.name = name; 
    else
        this.name = null; // or ""
}

答案 4 :(得分:0)

我在其他答案中犯了一个错误。

我相信来自StringUtils.defaultIfBlankApache Commons Lang可以解决您的问题。

在API中你可以看到:

  

返回传入的CharSequence,或者如果CharSequence是空格,为空(“”)或null,则返回defaultStr的值。

t.setName(StringUtil.defaultIfBlank(request.getParameter("name"), null));