【问题标题】:Java - Access variable inside and outside of for-loopJava - 在for循环内部和外部访问变量
【发布时间】:2012-05-11 13:24:43
【问题描述】:
String playerlist;

for(Player p : allplayers){
    playerlist += p.getDisplayName() + ", ";
}

sendMessage(playerlist);

我怎样才能做到这一点?我需要在我的 for 循环中有一个变量,然后在循环之外访问它。

谢谢,如果这是一个非常愚蠢的问题,我很抱歉。我就是想不通。

【问题讨论】:

  • 你发布的代码已经做到了,你需要什么?

标签: java variables loops for-loop


【解决方案1】:

你已经接近了。您需要将第一行更改为

String playerlist = "";

在Java中,在初始化之前使用变量是非法的,并且行

playerlist += p.getDisplayName() + ", ";

去糖(*)到

String temp = playerlist;
playerlist = temp + (p.getDisplayName() + ", ");

一旦初始化playerlist,您就可以将其内容读入临时变量,然后更新playerlist

不过,有两个更高级别的建议。

  1. 如果您有可用的连接方法,正如某些库提供的那样(.NETPython 平台也是如此),您可以只使用更易于阅读的连接。
  2. 但是,如果您没有可用的连接方法(AFAIK,Java 标准库没有提供这样的东西),您应该使用StringBuilder,这与@anubhava 的建议一致。您将在处理大量字符串时获得更好的性能,并且代码更易于理解,这是双赢的。

编辑:正如@edalorzo 在 cmets 中正确提到的那样,您只会因为未初始化 local 变量而收到错误,并且静态和实例字段都会自动初始化。具体来说,数值类型(intlongdouble等)初始化为0,布尔值初始化为false,引用类型初始化为null

规范明确描述了字段的自动初始化,因此您可以依赖它,但这很少是您想要的。通常,当您以后使用该字段时,您将需要该字段的非默认值,因为null 并不是非常有用(而且许多语言,特别是标准 ML 等函数式语言,完全没有null)。所以我建议在构造函数中初始化对象的所有字段。


(*):我上面展示的“去糖”几乎是准确的:事实上,playerlist 只被评估一次,这不会影响这个特定程序的行为。

【讨论】:

  • 哇,这很容易,非常感谢 :D 我想我尝试了每一种组合,我想我忘记了一个:) 一旦它允许我(12 分钟),我会接受作为最佳答案。
  • 也许值得一提的是,只有局部变量需要显式初始化,如 JLS 中所述。由于类和实例变量是显式初始化的,并且参数通过它们对应的参数接收一个值。
【解决方案2】:

局部变量playerlist 可能尚未初始化。在javafor循环语句中,局部变量必须先初始化,然后在循环块中使用。你必须初始化playerlist。您可以使用以下代码:

String playerlist = null;

for(Player p : allplayers)
{
    playerlist += p.getDisplayName() + ", ";
}

sendMessage(playerlist);

但最好使用以下代码:

StringBuilder playerlist = new StringBuilder();

for(Player p : allplayers)
{
    playerlist.append(p.getDisplayName()).append(", ");
}
sendMessage(playerlist.toString());

【讨论】:

  • -1 将playerlist 初始化为null 将导致不正确的行为(结果字符串开头的文字字符串“null”)。见stackoverflow.com/a/693617/960195
  • playList 局部变量可能为空,因此实例化的字符串变量无用。在此示例中,sendMessage 方法必须检查 null 传入值的状态。
【解决方案3】:

如果你在循环外初始化你的变量,你可以得到:

String playerlist = "";

但由于您正在操作字符串,因此使用StringBuilder 代替字符串会好得多。原因是字符串是不可变的,您将在 for 循环内的每次迭代中创建一个新字符串。但是 StringBuilder 是可变的,并且有各种重载的append 方法来支持您的操作。使用 StringBuilder 你的代码会变成这样:

StringBuilder playerlist = new StringBuilder();

for (Player p : allplayers) {
    playerlist.append(p.getDisplayName()).append(", ");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2016-12-05
    • 2016-05-07
    相关资源
    最近更新 更多