【问题标题】:The local variable string may not have been initialized peculiarity [duplicate]局部变量字符串可能尚未初始化特殊性[重复]
【发布时间】:2014-10-08 21:19:02
【问题描述】:

据我所知,初始化变量是在您为其设置值时。例如:

String s;        // declaring the String (throws an error if you use in conditionals)
String s = null; // declaring and then initializing the String (no error)

但是,当一个String被声明时,它不是自动初始化为null吗?因此,编译器不应该抛出错误。

我还注意到String s = new String(); 与条件一起使用时不会产生任何错误,但String s; 会产生任何错误。我认为这两种说法本质上是一回事,而后者甚至比前者更受鼓励。

我的问题是,为什么 String s = new String(); 有效,但 String s; 无效(使用条件设置其值时)?两个字符串不应该自动初始化为null,因此不会导致错误吗?

额外问题:既然String 对象会自动初始化为null,为什么下面的代码会打印一个空的String

String s  = new String();
System.out.println(s);

编辑:显然,当我累了时,我不会思考。这整个问题是一团糟,我不知道我在想什么。向那些不得不尝试理解它的人道歉。

另外,Oracle docson 默认值:

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化局部变量,请确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误。

哪个回答了上述问题。

【问题讨论】:

  • 你的问题和别人没有什么不同。 String 被初始化为null if 它在类中声明。并且new String() 会按照您的预期创建一个 String 对象,而不是 null。这里没有什么不寻常的地方。
  • String s = new String();相当于 String s = new String("");所以 s 在第一种情况下不为空。
  • 投票结束这个问题的许多重复项之一。 “奖励”问题是一个非问题,不需要重复,因为它在 Java 书籍第一章的任何介绍中都有回答。
  • @HovercraftFullOfEels 显然,当我累了的时候,我的思维会变得不清醒。为重复/愚蠢的问题道歉。
  • 没问题,祝你好运。

标签: java string object


【解决方案1】:

但是,当一个String被声明时,它不是自动初始化为null吗?因此,编译器不应该抛出错误。

不,这仅适用于类级别变量。局部变量没有分配默认值,但需要显式初始化。

既然String对象会自动初始化为null,为什么下面的代码会打印一个空的String呢?

String objects 永远不会初始化为 null。另一方面,类级别 String references 是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多