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