我应该将初始java String值从null设置为""吗?

Mar*_*ark 47 java string null initialization

我常常有一个班级:

public class Foo
{
private String field1;
private String field2;

// etc etc etc
}
Run Code Online (Sandbox Code Playgroud)

这使得field1和field2的初始值等于null.拥有我的所有String类字段会更好吗?

public class Foo
{
private String field1 = "";
private String field2 = "";

// etc etc etc
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我与类定义一致,我会避免很多空指针问题.这种方法有什么问题?

Yul*_*liy 73

那种方式就是疯狂(通常).如果您遇到很多空指针问题,那是因为您在实际填充它们之前尝试使用它们.那些空指针问题是响亮的令人讨厌的警告警报,告诉你这个用途在哪里,让你进入并解决问题.如果您最初将它们设置为空,那么您将冒险使用它们而不是您实际期望的那些.

  • +1,但有一点需要注意:如果您从数据库中填充对象,并且该数据库恰好是Oracle,那么空字符串将被视为null.但是,在这种情况下,明确初始化为""并不会对您有所帮助. (5认同)

Pau*_*lin 51

绝对不.空字符串和空字符串是完全不同的东西,你不应该混淆它们.

进一步解释:

  • "null"表示"我没有初始化此变量,或者它没有值"
  • "空字符串"表示"我知道它的值是什么,它是空的".

正如Yuliy已经提到的那样,如果你看到很多空指针异常,那是因为你希望事物在它们不存在时具有值,或者你在使用它们之前对于初始化事物感到邋..在任何一种情况下,您都应该花时间进行正确的编程 - 确保应该具有值的内容具有这些值,并确保如果您访问可能没有值的内容的值,则考虑到这一点.

  • @Chris:但Java并不是一种松散类型的语言,所以为什么还要为了让它看起来像一个半打的尝试呢? (5认同)

Mic*_*rdt 9

在特定情况下,在将其设置到其他位置之前使用的值是否真的有意义,并且在这种情况下表现为空字符串?ie是一个空字符串实际上是一个正确的默认值,并且有一个默认值是否有意义?

如果答案是肯定的,那么在声明中将其设置为""是正确的.如果没有,这是一个让bug更难找到和诊断的方法.


Joh*_*n O 8

我不同意其他海报.使用空字符串是可以接受的.我希望尽可能使用它.

在绝大多数情况下,null String和一个空String表示完全相同的东西 - 未知数据.无论您使用null还是空字符串表示,都是一个选择问题.


Eri*_*lje 7

一般来说,最好避免这种情况.有几个原因:

  1. 获取NullPointerException通常是一个很好的警告,您应该在应用之前使用变量,或者您忘记设置变量.将它设置为空字符串将消除NullPointerException,但可能会导致程序中的行更远(并且更难以跟踪)错误.

  2. null和""之间可以有一个有效的区别.空值通常表示未设置任何值或值未知.空字符串表示故意将其设置为空.根据您的计划,这种微妙的差异可能很重要.


小智 7

我知道这是一个老问题,但我想指出以下几点:

  String s = null;

  s += "hello";
  System.out.println(s);// this will return nullhello
Run Code Online (Sandbox Code Playgroud)

然而

  String s = "";

  s += "hello";
  System.out.println(s); // this will return hello
Run Code Online (Sandbox Code Playgroud)

显然,真正的答案是应该使用 StringBuffer 而不是仅仅连接字符串,但众所周知,对于某些代码,连接更简单。

  • 有什么不同?他们在我看来是一样的。 (7认同)

Pet*_*rey 5

我不建议。

相反,您应该为您的字段提供合理的值。如果他们不必改变,我会让他们成为最终的。

public class Foo { 
    private final String field1; 
    private final String field2;
    public Foo(String field1, String field2) {
       this.field1 = field1;
       this.field2 = field2;
    }
    // etc. 
} 
Run Code Online (Sandbox Code Playgroud)

无需分配,我尚未初始化值。只需给它初始值。