String playerlist;
for(Player p : allplayers){
playerlist += p.getDisplayName() + ", ";
}
sendMessage(playerlist);
どうすればこれを達成できますか? for ループ内に変数が必要で、ループの外で変数にアクセスする必要があります。
ありがとう、そしてこれが非常に初心者の質問であれば申し訳ありません。私はそれを理解することはできません。
ループ外で変数を初期化すると、次のようになります。
String playerlist = "";
ただし、文字列を操作しているため、文字列の代わりにStringBuilderを使用する方がはるかに優れています。理由は、文字列が不変であり、for ループ内の各反復で新しい文字列を作成することです。ただし、StringBuilder は可変でありappend
、操作をサポートするさまざまなオーバーロードされたメソッドがあります。StringBuilder を使用すると、コードは次のようになります。
StringBuilder playerlist = new StringBuilder();
for (Player p : allplayers) {
playerlist.append(p.getDisplayName()).append(", ");
}
あなたは近くにいます。最初の行を次のように変更する必要があります
String playerlist = "";
Java では、変数を初期化する前に使用することは違法です。
playerlist += p.getDisplayName() + ", ";
脱糖(*)~
String temp = playerlist;
playerlist = temp + (p.getDisplayName() + ", ");
を初期化するplayerlist
と、その内容を一時変数に読み取ってから更新できplayerlist
ます。
ただし、より高いレベルの提案が 2 つあります。
編集: @edalorzo がコメントで正しく言及しているように、ローカル変数を初期化しない場合にのみエラーが発生し、静的フィールドとインスタンス フィールドの両方が自動的に初期化されます。具体的には、数値型 ( int
、long
、double
など) は 0 に初期化され、ブール値は に初期化されfalse
、参照型は に初期化されnull
ます。
仕様では、フィールドの自動初期化が明示的に記述されているため、信頼できますが、それが必要になることはめったにありません。通常、後で使用するときに、フィールドのデフォルト以外の値が必要になります。これは、null
それほど有用ではないためです (そして、多くの言語、特に標準 ML のような関数型言語では、まったく使用しませんnull
)。したがって、コンストラクターでオブジェクトのすべてのフィールドを初期化することをお勧めします。
(*): 上に示した「脱糖」はほぼ正確です。実際にplayerlist
は、一度だけ評価されるため、この特定のプログラムの動作には影響しません。
ローカル変数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());