Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 奇怪';空';字符串作为值并使字符串对象不为空,为什么?_Java - Fatal编程技术网

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
的值是空字符串。这就是他们行为不同的原因。见我答案的第三个音符。