Java - for循环内部和外部的访问变量

时间:2012-05-02 03:57:33

标签: java variables loops for-loop

String playerlist;

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

sendMessage(playerlist);

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

谢谢,对不起,如果这是一个非常愚蠢的问题。我只是想不出来。

3 个答案:

答案 0 :(得分:7)

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

String playerlist = "";

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

StringBuilder playerlist = new StringBuilder();

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

答案 1 :(得分:6)

你很亲密。您需要将第一行更改为

String playerlist = "";

在Java中,在变量初始化之前使用变量和行

是非法的
playerlist += p.getDisplayName() + ", ";

desugars(*)to

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

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

但是有两个更高级别的建议。

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

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

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


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

答案 2 :(得分:0)

本地变量playerlist可能尚未初始化。在java for循环语句中,局部变量必须首先初始化然后在循环块中使用。您必须初始化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());