Java 8 Java可选用法:仍然需要Eclipse尝试捕获块

Java 8 Java可选用法:仍然需要Eclipse尝试捕获块,java-8,optional,Java 8,Optional,我试图使用Java8的可选版本,但遇到了一些问题 我认为通过使用Optional,不再需要进行存在性检查(如果我错了,请纠正我)。因此,我做了以下工作: public Optional<File> ipModeFile(String ipMode) { File file = new File(ipMode); if(file.exists()) { return Optional.of(file); }

我试图使用Java8的可选版本,但遇到了一些问题

我认为通过使用Optional,不再需要进行存在性检查(如果我错了,请纠正我)。因此,我做了以下工作:

public Optional<File> ipModeFile(String ipMode) {
        File file = new File(ipMode);
        if(file.exists()) {
            return Optional.of(file);
        }
        return Optional.empty();
    }

可选的优点之一不仅仅是可以省略一些空检查?

在您的示例中,
FileWriter
不是。即使是这样,(aka a a maybe type)也会针对
NullPointerException
(而不是
IOException
)进行保护。从
可选的
Javadoc

可以包含或不包含非空值的容器对象。如果存在值,isPresent()将返回true,get()将返回该值


我明白问题所在。谢谢。值得注意的是,
file.exists()
可能导致
FileNotFoundException
不太可能,但并非不可能。这是一种先检查后执行的模式,它不是线程安全的(也不受其他进程所做更改的影响)。因此,Java将始终坚持处理
FileNotFoundException
,而不管
file.exists()
是否在操作之前已被验证。您需要
可选的.ifPresent(lambda)
if(ipV4ModeFile.isPresent()) {
    File file = ipV4ModeFile.get();
    FileWriter writer;
    writer = new FileWriter(file, false); // Unhandled exception type IOException
    writer.write(TURNOFF_IPV4); 
    writer.close(); 
}