Java 在比较器中处理IOException的正确方法是什么?

Java 在比较器中处理IOException的正确方法是什么?,java,Java,我用比较器按修改日期对文件进行排序。这些文件将针对包含的数据进行处理,并在处理后删除。在处理这些文件之前,我必须确保它们是按顺序排列的。以下是我到目前为止的情况 public class FileComparator implements Comparator<Path> { @Override public int compare(Path o1, Path o2) { try { return Files.getLast

我用比较器按修改日期对文件进行排序。这些文件将针对包含的数据进行处理,并在处理后删除。在处理这些文件之前,我必须确保它们是按顺序排列的。以下是我到目前为止的情况

public class FileComparator implements Comparator<Path> {  
    @Override
    public int compare(Path o1, Path o2) {
        try {
            return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2));
        } catch (IOException exception) {
            //write to error log
            //***
        }
    }
}
公共类FileComparator实现Comparator{
@凌驾
公共整数比较(路径o1,路径o2){
试一试{
返回Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2));
}捕获(IOException异常){
//写入错误日志
//***
}
}
}
***这就是我被困的地方。我必须返回一个int,因为compare需要它,但我不想返回零,当它失败时具有假等价性

我尝试重新构造代码,但如果getLastModifiedTime()失败,o1Modified和o2Modified将为null

public class FileComparator implements Comparator<Path> {  
    @Override
    public int compare(Path o1, Path o2) {
        FileTime o1Modified = null;
        FileTime o2Modified = null;        
        try {
            o1Modified = Files.getLastModifiedTime(o1);
            o2Modified = Files.getLastModifiedTime(o2);
        } catch (IOException exception) {
            //write to error log

        }

        return o1Modified.compareTo(o2Modified);

    }
}
公共类FileComparator实现Comparator{
@凌驾
公共整数比较(路径o1,路径o2){
FileTime o1Modified=null;
FileTime o2Modified=null;
试一试{
o1Modified=Files.getLastModifiedTime(o1);
o2Modified=Files.getLastModifiedTime(o2);
}捕获(IOException异常){
//写入错误日志
}
返回O1修改。与(O2修改)相比;
}
}

有没有标准的方法来处理这样的情况?

抛出一个包含IOException的运行时异常:

    try {
        return Files.getLastModifiedTime(o1).compareTo(Files.getLastModifiedTime(o2));
    } catch (IOException e) {
        throw new UncheckedIOException("impossible to get last modified dates, so can't compare", e)
    }

但是请注意,修改后的时间可能会在排序过程中发生变化,这将使您的比较器不正确:它将不再遵守其契约。因此,更好的方法是首先遍历路径,并将它们包装到一些存储上次修改时间的
TimedPath
对象中,然后对这些TimedPath对象进行排序。

我认为解决这种特殊情况的方法是在每个路径上准确地调用
Files.getLastModifiedTime()
,存储结果,然后在排序过程中使用存储的结果

这有几个好处:

  • 它干净地解决了
    IOException
    问题

  • 它不会在相同的文件上重复和不必要地执行同样昂贵的I/O操作

  • 即使文件的最后一次修改时间在排序过程中发生了变化,它也能确保一致的排序(例如,请参阅如何巧妙地破坏代码)


  • 如果您收到一个
    IOException
    ,这意味着您的路径有问题。如果一个(或两个)路径指向一个不存在的文件,那么说它们不相等是否有意义?您可以按照自己的意愿进行排序(根据具体情况返回-1或1)。另一种说法是,所有无效路径都同样无效。感谢您建议使用TimedPath对象。NPE的答案解决了我的问题,你创建时间感知对象的建议改进了解决方案。好的答案是解决问题的根本原因,而不是创可贴。