Java 奇怪';空';字符串作为值并使字符串对象不为空,为什么?
试试这段代码,你会看到输出,代码使用两个字符串,一个在类中,另一个在变量中,这两种用法的输出非常不同和奇怪,我为什么和如何解决它Java 奇怪';空';字符串作为值并使字符串对象不为空,为什么?,java,Java,试试这段代码,你会看到输出,代码使用两个字符串,一个在类中,另一个在变量中,这两种用法的输出非常不同和奇怪,我为什么和如何解决它 ---------With class... null null null hello ---------With variable... null hello 将null设置为名称将成为字符串的此值,为什么?我需要名称为null,而不是“null” 谢谢你的帮助 //'main' method must be in a class 'Rextester'. /
---------With class...
null
null
null hello
---------With variable...
null
hello
将null设置为名称将成为字符串的此值,为什么?我需要名称为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 );
}
}
您可以调用isEmpty()方法,如果name为空,该方法将返回true
name.isEmpty()
这是因为您的
'validateName(String name)
方法返回'false'
,因此'setName(String name)
方法不执行任何操作,类成员'name'
保持'null'
这是因为
'request.get参数(“name”)
调用根据您的帖子返回一个空字符串。也许您可以尝试将setName更改为:
public void setName( String name ) {
if (this.validateName( name )) {
this.name = name;
} else {
this.name = "";
}
}
作为替代方案?希望有帮助。您的输出来自以下语句:
System.out.println( "'" + name + "'" )
它只打印包含空值的字符串连接的结果
根据:
如果只有一个操作数表达式的类型为String
,则在运行时对另一个操作数执行字符串转换()
说:
如果引用为null
,它将转换为字符串“null
”(四个ASCII字符n
,u
,l
)
如果要打印不带引号的文本null
,则必须不打印引号:
System.out.println( name != null ? "'" + name + "'" : "null" )
或者,如果您希望null像空字符串一样打印(哑,因为这样您就看不到区别):
在不同的主题上,
name.trim()!=“
不起作用
您不能使用==
和=代码>以比较字符串
使用!name.trim().isEmpty()
第三个注意事项:您不应该默默地忽略错误的输入
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;
}
public void setName( String name ) {
if (this.validateName( name ))
this.name = name;
else
this.name = null; // or ""
}
或在输入错误时指定null或空白:
public void setName( String name ) {
if (! this.validateName( name ))
throw new IllegalArgumentException("Name cannot be null or blank");
this.name = name;
}
public void setName( String name ) {
if (this.validateName( name ))
this.name = name;
else
this.name = null; // or ""
}
我在另一个答案中犯了一个错误
我相信这能解决你的问题
在API中,您可以看到:
返回传入的CharSequence,或者如果CharSequence为空白、空(“”)或null,则返回defaultStr的值
虽然它没有直接回答这个问题,但是我们已经让servlet给值'null'(字符串),所以我们添加了这样的测试:`if(“null”.equals(test)| | StringUtils.isBlank(test)){…}`。Apache Commons非常有用。但是,测试是否合适取决于是否允许使用带有N个空格的字符串。取决于验证要求。用户名为“”(所有空格)可能是个坏主意;它不是空的,但会被修剪<代码>名称!=null&&name.trim().isEmpty()
是一个选项。如果NPE is name为null,请查看问题的最新更新,并测试最新代码,您将看到将字符串名称与变量和类一起使用的区别。在t.setName(t.getName()+“hello”)
行中,getName()的值
为空。在nullString+“hello”
行中,nullString
的值是空字符串。这就是他们行为不同的原因。见我答案的第三个音符。