在以下代码段中,我具有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类。您可以从...
在这种情况下,您将无法摆脱警告。生成警告的代码检查不足以完全分析所有代码路径并了解method2
的意图。
可选为避免NPE的手段。如果您检查Optional.get(),那么如果Optional.isPresent()为false,则此方法将引发异常。因此,如果您使用“ get”而不进行初步检查“ isPresent”,则没有任何好处。要修复它,请在“获取”之前检查“ isPresent”。但我建议您考虑使用诸如“ getOrElse”,“ ifPresent”之类的东西。