当Optional.isPresent和Optional.get被称为“不同”级别时显示警告?

问题描述 投票:0回答:2

在以下代码段中,我具有Foo类,该方法始终返回相同的Optional实例。然后,我还有另一个使用OneMoreClass类的Foo类。

您可以从源代码中看到在get()中调用method1方法是安全的,因为始终在method2中对其进行检查。

IntelliJ IDEA仍然显示警告的问题(您只需将此代码段复制到IDEA,就会看到该问题。)>

public class Example {

    public static class Foo {

        private final Optional<String> value = Optional.empty();

        public Optional<String> bar() {
            return value;
        }
    }

    public static class OneMoreClass {
        void method1(final Foo foo) {
            method2(foo);
            System.out.println(foo.bar().get()); // here the warning is shown in IntelliJ IDEA: 
                                                 // "Optional.get()" without "isPresent()" check
        }

        void method2(final Foo foo) {
            if (!foo.bar().isPresent()) {
                throw new IllegalArgumentException("No value");
            }
        }
    }
}

问题是:

如何解决警告?有什么技巧可以避免此警告?

在下面的代码片段中,我有Foo类,该类的方法始终返回Optional的相同实例。然后,我还有另一个使用Foo类的OneMoreClass类。您可以从...

java intellij-idea java-stream optional
2个回答
2
投票

在这种情况下,您将无法摆脱警告。生成警告的代码检查不足以完全分析所有代码路径并了解method2的意图。


0
投票

可选为避免NPE的手段。如果您检查Optional.get(),那么如果Optional.isPresent()为false,则此方法将引发异常。因此,如果您使用“ get”而不进行初步检查“ isPresent”,则没有任何好处。要修复它,请在“获取”之前检查“ isPresent”。但我建议您考虑使用诸如“ getOrElse”,“ ifPresent”之类的东西。

© www.soinside.com 2019 - 2024. All rights reserved.