Por que Double.parseDouble (null) e Integer.parseInt (null) lançam exceções diferentes?

92

Por que Double.parseDouble (null) e Integer.parseInt (null) lançam exceções diferentes?

Este é um acidente histórico ou intencional? A documentação afirma claramente dois tipos de exceções para Double.parseDouble(...)e uma para Integer.parseInt(), mas parece inconsistente:

Integer.parseInt(null); // throws java.lang.NumberFormatException: null

Contudo

Double.parseDouble(null); // throws java.lang.NullPointerException
pho79
fonte
2
@Aquillo: Há docs.oracle.com/javase/tutorial/java/nutsandbolts/…double primitivo
nhahtdh
2
Verificando o código-fonte dos respectivos métodos, parece apenas uma inconsistência. parseDoublenão faz uma verificação de nulo e apenas lança um NPE quando é encontrado, mas em parseInt, a seqüência de entrada é verificada null. Não consigo ver nenhuma boa razão para que eles se comportem de maneira diferente.
NilsH
Eu verifiquei que eles lançam a mesmaNumberFormatException.
twlkyao

Respostas:

67

É razoável esperar que as mesmas exceções sejam lançadas para null; no entanto, essas APIs são muito antigas e talvez não possam ser alteradas neste momento.

E:

Como o comportamento da exceção é antigo e especificado no JavaDoc, é impraticável alterar o comportamento de qualquer um dos métodos neste momento. Fechar como não vai resolver.

Como retirado de: Relatório de Bug: Integer.parseInt () e Double.parseDouble () lançam diferentes exceções em null.

Como outros afirmaram: provavelmente é feito por diferentes autores.

Floris Velleman
fonte
2
Relatório de bug interessante e relacionado: bugs.sun.com/view_bug.do?bug_id=6463998 Parece como em Java 6, o método de análise da classe Double / Float lança NPE.
nhahtdh
2
Curiosamente, o comentário dizia que essa funcionalidade era "muito antiga" na época, e isso foi há 15 anos agora.
Southpaw Hare
Essa inconsistência provavelmente se origina no Java 1.0. Infelizmente, seria difícil verificar isso. Não creio que o Java 1.0 esteja disponível para download e você precisaria de uma caixa com Windows 95 / NT para executá-lo. Ou uma máquina SPARC antiga.)
Stephen C
59

Nota: tudo neste post está na fonte do Java7-b147

Double.parseDouble()entra em uma biblioteca Sun (em sun.misc.FloatingDecimal) a primeira coisa importante que acontece é:

in = in.trim(); // don't fool around with white space.
                // throws NullPointerException if null

Integer.parseInt()é feito manualmente na Integeraula. A primeira coisa importante que acontece é:

if (s == null) {
    throw new NumberFormatException("null");
}

Eu acho que existem dois autores diferentes.

durron597
fonte