web-dev-qa-db-ja.com

値にアクセスする前に「Optional#isPresent()」を呼び出します

以下のコードスニペットのSonarの問題の値にアクセスする前に、Call "Optional#isPresent()"を取得しているので、この問題の解決にご協力ください。

List <Department> deptList =new ArrayList();

List<Student> studList=new ArrayList();

Department dept= studList.stream().min(comparator.comparing(Department::getDepartmentNo)).get();

値にアクセスする前に「Optional#isPresent()」を呼び出します

5
Thirukumaran

コードを機能させるには、Optionの安全なオプションの少なくとも1つを使用します(ha、ここで許可されている単語の冗長性)

Department dept= studList.stream().min(comparator.comparing(Department::getDepartmentNo)).orElse(null);

空のリストの場合、「null」を1つの値にする必要がありますが、コンテキストがわかりません。そのため、nullを入力します。nullを使用しないでください。正しい値を選択してください。

Optional#get()は、Optional内に何もない場合に例外をスローします。 Sonarは、以下のスニペットのように値を取得する前にオプションを確認するように求めていますが、Optionalクラスの全体的な考え方は、nullポインターの例外を防ぐことであるため、お勧めしません。

Optional<Department> deptOpt= studList.stream().min(comparator.comparing(Department::getDepartmentNo));

Department department = null;
if(deptOpt.isPresent())
    department = deptOpt.get();
}

物事を行うためのより良い方法は次のとおりです。

Department department = deptOpt.orElse(Department::new);

この場合、Optionalに値が含まれていない(空の)場合、deptOptはデフォルトのDepartmentオブジェクトを返します。

とにかく-どのアプローチを選択しても、Sonarの問題は解決するはずです。

4
Danylo Zatorsky