Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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-Access for循环内外的变量_Java_Variables_Loops_For Loop - Fatal编程技术网

Java-Access for循环内外的变量

Java-Access for循环内外的变量,java,variables,loops,for-loop,Java,Variables,Loops,For Loop,我怎样才能做到这一点?我需要在for循环内有一个变量,然后在循环外访问它 谢谢,如果这是一个很难回答的问题,我很抱歉。我就是想不出来。你很接近了。您需要将第一行更改为 String playerlist; for(Player p : allplayers){ playerlist += p.getDisplayName() + ", "; } sendMessage(playerlist); 在Java中,在初始化变量之前使用变量是非法的,并且 String playerlist

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


谢谢,如果这是一个很难回答的问题,我很抱歉。我就是想不出来。

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

String playerlist;

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

sendMessage(playerlist);
在Java中,在初始化变量之前使用变量是非法的,并且

String playerlist = "";
desugars(*)至

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

不过,有两个更高层次的建议

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

  • 编辑:正如@edalorzo在评论中正确地提到的,您只会因为没有初始化局部变量而得到一个错误,静态和实例字段都会自动初始化。具体而言,数字类型(
    int
    long
    double
    等)初始化为0,布尔值初始化为
    false
    ,引用类型初始化为
    null

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



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

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

    String playerlist;
    
    for(Player p : allplayers){
        playerlist += p.getDisplayName() + ", ";
    }
    
    sendMessage(playerlist);
    
    在Java中,在初始化变量之前使用变量是非法的,并且

    String playerlist = "";
    
    desugars(*)至

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

    不过,有两个更高层次的建议

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

  • 编辑:正如@edalorzo在评论中正确地提到的,您只会因为没有初始化局部变量而得到一个错误,静态和实例字段都会自动初始化。具体而言,数字类型(
    int
    long
    double
    等)初始化为0,布尔值初始化为
    false
    ,引用类型初始化为
    null

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



    (*):我上面显示的“desugaring”几乎是准确的:事实上,
    playerlist
    只计算一次,这不会影响这个特定程序的行为。

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

    String temp = playerlist;
    playerlist = temp + (p.getDisplayName() + ", ");
    
    但由于您正在操作字符串,因此使用它而不是字符串会更好。原因是字符串是不可变的,您将在for循环内的每次迭代中创建一个新字符串。但是,StringBuilder是可变的,并具有各种重载的
    append
    方法来支持您的操作。使用StringBuilder,您的代码将如下所示:

    String playerlist = "";
    

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

    String temp = playerlist;
    playerlist = temp + (p.getDisplayName() + ", ");
    
    但由于您正在操作字符串,因此使用它而不是字符串会更好。原因是字符串是不可变的,您将在for循环内的每次迭代中创建一个新字符串。但是,StringBuilder是可变的,并具有各种重载的
    append
    方法来支持您的操作。使用StringBuilder,您的代码将如下所示:

    String playerlist = "";
    

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

    StringBuilder playerlist = new StringBuilder();
    
    for (Player p : allplayers) {
        playerlist.append(p.getDisplayName()).append(", ");
    }
    
    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(", ");
    }
    
    String playerlist = null;
    
    for(Player p : allplayers)
    {
        playerlist += p.getDisplayName() + ", ";
    }
    
    sendMessage(playerlist);
    

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

    StringBuilder playerlist = new StringBuilder();
    
    for (Player p : allplayers) {
        playerlist.append(p.getDisplayName()).append(", ");
    }
    
    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(", ");
    }
    
    String playerlist = null;
    
    for(Player p : allplayers)
    {
        playerlist += p.getDisplayName() + ", ";
    }
    
    sendMessage(playerlist);
    

    你发布的代码已经做到了,你需要什么?你发布的代码已经做到了,你需要什么?哇,这很简单,非常感谢:D我想我尝试了每种组合,我想我忘记了一种:)一旦它允许我(12分钟),我会接受作为最佳答案。也许值得一提的是,只有局部变量需要显式初始化,如中所述。因为类和实例变量是显式初始化和参数化的