以下に、2つの回避方法をそれぞれ別々のコードとして示し、コメントアウトで解説を追加します。
方法1: keys.clear();
を削除して例外を回避
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
// HashMapを作成してキーと値を格納するための静的マップ
static Map<String, String> map = new HashMap<>();
// 不変リストを使用 (例外が発生する可能性のあるリスト)
static List<String> keys = List.of("A", "B", "C");
// 値の配列を定義
static String[] values = {"1", "2", "3"};
// 静的初期化ブロックでキーと値をマップに追加
static {
for (int i = 0; i < keys.size(); i++) {
map.put(keys.get(i), values[i]);
}
}
public static void main(String[] args) {
// 例外が発生するkeys.clear()の呼び出しを削除
// keys.clear(); // この行を削除することで例外を回避
// values配列を空にする
values = new String[0];
// マップのサイズ、キーリストのサイズ、values配列の長さを出力。3,3,0
System.out.println(map.size() + "," + keys.size() + "," + values.length);
}
}
解説:
-
方法1:
keys.clear();
を削除して例外を回避-
keys
リストはList.of("A", "B", "C")
を使用して不変リストとして作成されています。 - 不変リストのため、変更操作(例:
clear()
)はサポートされておらず、keys.clear();
を呼び出すとUnsupportedOperationException
が発生します。 - この例外を回避するために、
keys.clear();
の行を削除しました。
-
map.size() は 3(マップには3つのキーと値のペアが格納されています)
keys.size() は 3(keysリストは不変であり、変更されないので3つの要素を持っています)
values.length は 0(values配列は空に変更されました)
方法2: 可変リストを使用して例外を回避
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainWithMutableKeys {
// HashMapを作成してキーと値を格納するための静的マップ
static Map<String, String> map = new HashMap<>();
// 可変リストを使用 (例外を回避するためのリスト)
static List<String> keys = new ArrayList<>(List.of("A", "B", "C"));
// 値の配列を定義
static String[] values = {"1", "2", "3"};
// 静的初期化ブロックでキーと値をマップに追加
static {
for (int i = 0; i < keys.size(); i++) {
map.put(keys.get(i), values[i]);
}
}
public static void main(String[] args) {
// 可変リストの場合、keys.clear()は正常に動作する
keys.clear(); // この行は正常に動作
// values配列を空にする
values = new String[0];
// マップのサイズ、キーリストのサイズ、values配列の長さを出力。3,0,0
System.out.println(map.size() + "," + keys.size() + "," + values.length);
}
}
解説:
-
方法2: 可変リストを使用して例外を回避
-
keys
リストをnew ArrayList<>(List.of("A", "B", "C"))
を使用して可変リストとして作成します。 - これにより、
keys.clear();
が正常に動作し、例外は発生しません。 -
keys.clear();
を呼び出しても問題なくリストをクリアすることができます。
-
map.size() は 3(マップには3つのキーと値のペアが格納されています)
keys.size() は 0(keys.clear();によってkeysリストが空になります)
values.length は 0(values配列は空に変更されました)
Top comments (0)