0

ネットワーク インターフェイスのリストを出力しようとしています (最終的には、何らかの文字列配列に格納します)。次のコードは、次の場合にのみインターフェイスのリストを出力します。

    String[] networkInterfaces = new String[Collections.list(nets).size()];

行はありません。その 1 行が存在しない場合は、リスト全体が出力されます。

    Enumeration<NetworkInterface> nets = null;
    try {
        nets = NetworkInterface.getNetworkInterfaces();
    } catch (SocketException e) {
        e.printStackTrace();
    }
    System.out.println(Collections.list(nets).size());
    String[] networkInterfaces = new String[Collections.list(nets).size()];

    for (NetworkInterface netint : Collections.list(nets)) {
        System.out.println(netint.getName());
    }

この質問にタグがなくて申し訳ありません。何が適切かわかりませんでした。なぜこれが発生するのですか?コレクションが ArrayList に保存されるように変更しました(これで問題ないようです)

    ArrayList<NetworkInterface> netints = Collections.list(nets);

しかし、なぜ他の方法がうまくいかなかったのか、私はまだ興味があります。ありがとう :)

4

1 に答える 1

4

つまり、 anEnumerationはステートフル イテレータだからです。

初めて を呼び出すとCollections.list(nets)、このライブラリ メソッドは列挙型をループし、nets列挙型が返す要素がなくなるまで要素を引き出します。これは期待どおりに機能し、返されるリストは期待どおりです。

ただし、次の行でもう一度呼び出しCollections.list(nets) ます。これは からすべての要素を引き出しますがnetsこれは現在は使い尽くされているため、(より多くの) 要素を持たない列挙から空のリストを「正しく」作成します。

この問題を解決する 1 つの方法は、すぐにリストに変換netsし、そのリストをどこでも参照することです。したがって、コードの開始を次のように変更できます。

List<NetworkInterface> nets = null;
try {
    nets = Collections.list(NetworkInterface.getNetworkInterfaces());
}
...

そして、nets毎回列挙をラップする代わりに、後でリストを参照するだけです。

于 2012-10-30T09:08:16.003 に答える