public int obtemTamanho(File arquivo) {
long l = arquivo.length();
return (int) l;
}
long a = System.currentTimeMillis();
long b = a + 100;
System.out.println((int) b-a);
No primeiro código, o desenvolvedor, seja qual for a razão, busca o tamanho de um arquivo em um método que retorna int
em vez de long
. Este código não suporta arquivos maiores que 2GB e apenas retorna o tamanho errado neste caso. Todo código que faz cast de um valor para um tipo menor deve primeiro verificar a possibilidade de overflow e lançar uma exceção se for o caso.
O segundo código é outra versão de bug de overflow. Note os parênteses faltantes no comando de println
: cast de tipo precede o operador de menos.
public int obtemTamanho(File arquivo) {
long l = arquivo.length();
if (l > Integer.MAX_VALUE){
throw new IllegalStateException(
"Overflow de int.");
}
return (int) l;
}
long a = System.currentTimeMillis();
long b = a + 100;
System.out.println((int) (b-a));