안드로이드 개발 질문/답변
(글 수 45,052)
파일 목록을 생성된 순서대로 정렬하여 오래된 것을 삭제하려고 합니다.
하지만 정렬을 할 때 예외가 발생합니다. 문제는 모든 단말기에서 발생하지 않고 몇몇 단말기에서 발생됩니다.
Arrays.sort의 부분에서 예외가 발생합니다.
File[] files = dir.listFiles();
if (files == null) {
return;
}
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File file1, File file2) {
return (int) (file2.lastModified() - file1.lastModified());
}
});
int len = files.length;
for (int i = keepCnt; i < len; i++) {
File f = files[i];
f.delete();
}예외 발생 내용은 아래와 같습니다.
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:864)
at java.util.TimSort.mergeAt(TimSort.java:481)
at java.util.TimSort.mergeForceCollapse(TimSort.java:422)
at java.util.TimSort.sort(TimSort.java:219)
at java.util.TimSort.sort(TimSort.java:169)
at java.util.Arrays.sort(Arrays.java:1907)
위의 소스에 잘못된 부분이 있다면 지적 좀 부탁드립니다. 그리고 예외발생된 원인을 알고 싶습니다.




lastModified 메소드의 리턴값은 long 입니다.
long 끼리 연산 후 int 로 변환하는 과정에서 오버플로우가 난게 아닐까 추정되네요.
아래처럼 바꾸고 테스트해보세요.
long lhs = file1.lastModified() ;
long rhs = file2.lastModified() ;
if(lhs < rhs) return 1 ;
else if(lhs > rhs) return -1 ;
else return 0 ;