尝试这段代码,你会看到输出,代码在一个类中使用两个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 );
}
}
答案 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字符n
,u
,l
,l
)。
如果您要打印不带引号的文字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.defaultIfBlank
的Apache Commons Lang可以解决您的问题。
在API中你可以看到:
返回传入的CharSequence,或者如果CharSequence是空格,为空(“”)或null,则返回defaultStr的值。
t.setName(StringUtil.defaultIfBlank(request.getParameter("name"), null));