簡體   English   中英

Java-for循環內外的訪問變量

[英]Java - Access variable inside and outside of for-loop

String playerlist;

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

sendMessage(playerlist);

我該怎么做? 我需要在for循環內有一個變量,然后在循環外訪問它。

謝謝,如果這是一個非常棘手的問題,對不起。 我只是想不通。

如果在循環外初始化變量,則可以得到:

String playerlist = "";

但是,由於您要處理字符串,因此使用StringBuilder代替String會更好。 原因是String是不可變的,您將在for循環的每次迭代中創建一個新的String。 但是,StringBuilder是可變的,並且具有各種重載的append方法來支持您的操作。 使用StringBuilder,您的代碼將如下所示:

StringBuilder playerlist = new StringBuilder();

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

你近了 您需要將第一行更改為

String playerlist = "";

在Java中,在初始化變量之前使用變量是非法的,並且該行

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

desugars(*)至

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

初始化playerlistplayerlist ,便可以將其內容讀入臨時變量中,然后更新playerlist

但是,有兩個更高層次的建議。

  1. 如果有某些庫提供的聯接方法( .NETPython平台也是如此),則可以使用聯接,它更易於閱讀。
  2. 但是,如果沒有可用的join方法(AFAIK,Java標准庫不提供此類方法),則應使用StringBuilder ,與@anubhava的建議一致。 您將在大量字符串上獲得更好的性能,並且代碼更易於理解,這是雙贏的。

編輯:正如@edalorzo在評論中正確提到的那樣,您只會因未初始化局部變量而得到錯誤,並且靜態字段和實例字段都會自動初始化。 具體來說,數字類型( intlongdouble等)初始化為0,布爾值初始化為false ,引用類型初始化為null

該規范明確描述了字段的自動初始化,因此您可以依靠它,但這很少是您想要的。 通常,以后使用該字段時,您將需要該字段的非默認值,因為null並不是非常有用(而且許多語言,尤其是像Standard ML這樣的功能語言,都完全沒有null )。 因此,我建議在構造函數中初始化對象的所有字段。


(*):上面顯示的“減糖”幾乎是准確的:實際上, playerlist僅被評估一次,這不會影響該特定程序的行為。

本地變量playerlist可能尚未初始化。 在java for loop語句中,局部變量必須首先初始化,然后在in循環塊中使用。 您必須初始化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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM