2017-03-13 8 views
-1

エラーが私を助けて?getOnlinePlayersエラークラス

public static void onDisableMod() 
{ 
Player[] arrayOfPlayer; 
int j = (arrayOfPlayer = Bukkit.getOnlinePlayers()).length; 
for (int i = 0; i < j; i++) 
{ 
    Player online = arrayOfPlayer[i]; 
    if (modMode.contains(online.getName())) 
    { 
    online.setMetadata("ModMode", new FixedMetadataValue(Main.pl, Integer.valueOf(1))); 
    leaveMod(online); 
    } 
} 
} 
+0

'getOnlinePlayers()'がコレクションを返す場合、配列に割り当てることはできません。配列はコレクションと同じではありません。 – khelwood

+0

ようこそスタックオーバーフロー! [ツアー](http://stackoverflow.com/tour)を見て回り、[ヘルプセンター](http://stackoverflow.com/help)、特に[どのように私に質問しますか良い質問?](http://stackoverflow.com/help/how-to-ask)と[ここで私はどのような話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)。 - * 'int j =(arrayOfPlayer = Bukkit.getOnlinePlayers())。length;' *このような「スマートコード」は避けてください。 –

答えて

0

エラーを手元で解決するには、タイプ変換の問題です。コメントに既に記載されているkhelwoodのように、JavaコレクションにJavaコレクションを割り当てようとしていますが、それらは1つではありません。

あなたがPlayerの配列を操作する必要がない場合は、配列

しかし
Player[] arrayOfPlayer = Bukkit.getOnlinePlayers().toArray(new Player[0]); 

ではなく、時間の配列を作成する無駄を作成するには、次を使用することができ、あなたは、単にで直接コレクションの反復子することができます次の2つの方法の1:1)暗黙のうちに、

for (Player p : Bukkit.getOnlinePlayers()) { 
    if (modMode.contains(p.getName())) { 
     ... 
    } 
} 

または、2)明示的に、

Iterator<? extends Player> it = Bukkit.getOnlinePlayers().iterator(); 
while (it.hasNext()) { 
    Player p = it.next(); 
    if (modMode.contains(p.getName())) { 
     ... 
    } 
} 

後者の方法は、メソッドが基になるコレクションを変更した場合に便利です。 getOnlinePlayers()から要素を削除することはできません。変更可能なリストではありません。

更新

私はもともとOPの限られた経験を与えられたラムダ例を提供するために躊躇。ラムダは、実行されるアクションをさらに検討することなく、イテレータタスクのすべてのタイプのドロップイン置換であるとは限らず、別の明確な疑問が生じる可能性があります。

上述したように、可能なストリームの形式は次のようになります。

Bukkit.getOnlinePlayers().stream() 
    .filter(modMode::contains) 
    .forEach(p -> { 
     p.setMetadata("ModMode", new FixedMetadataValue(Main.pl, 1)); 
     leaveMod(p); 
    }); 

これはさらに、両方が常にプレーヤーをマッチングさせるために実行されることを考えると、leaveMod()内プレイヤのメタデータを設定することにより、機能的表現に向かって微調整することができます。 onDisableMod()leaveMod()クラスModUtilsの静的メソッドであると仮定すると、上記ストリームは、与えられた全ての反復の例についてgetOnlinePlayers()

で繰り返し処理

Bukkit.getOnlinePlayers().stream() 
    .filter(modMode::contains) 
    .forEach(ModUtils::leaveMod); 

特別な懸念を次のように、慎重にあるべきでさらに精製し、統合することができ彼らはメインスレッドまたは同期スレッドで実行されることを行使しました。さらに、反復中に、テレポート、キック、キル、または同じ事を行うcallEvent()経由のイベントの発動など、コレクションに影響を与える副作用がないように注意する必要があります。このような場合には

、ベストプラクティスは、

List<Player> olp = new ArrayList<>(Bukkit.getOnlinePlayers()); 

のようにコレクションのコピーで動作し、繰り返しの3種類のいずれかを続行することです。

+0

新しいプレーヤー[0]を使用する理由サーバーの最大プレーヤー容量を使用する方が良いです。 – RoccoDev

+0

@RoccoDev FindBugsまたはPMDを使用していますか?まず、反復の目的でコレクションから 'toArray()'を介して配列を作成することは悪い設計であることに注意してください。しかし、必要があれば、長さがゼロの配列を渡すと、JDKにonusが置かれ、正しいサイズの配列を返すようになります。独自の配列をローリングすると不要なコードや潜在的なエラーが追加されます。現時点でのプレイヤーの数よりも大きい配列を返すため、アレイが盲目的に反復されると、潜在的なNPEが発生します。なぜ不要なリスクを追加するのですか? – Frelling

+0

1. Nah 2.私のプロジェクトではほとんど必要としない配列を使用していることに留意していただきありがとうございます。 – RoccoDev

関連する問題