Em Java, o que é mais altamente recomendado e por quê? Ambos os tipos lançam exceções, portanto, nesse sentido, lidar com eles é o mesmo. assert
é um pouco mais curto, mas não tenho certeza do quanto isso importa.
public void doStuff(Object obj) {
assert obj != null;
...
}
vs
public void doStuff(Object obj) {
if (obj == null) {
throw new IllegalArgumentException("object was null");
}
...
}
java
exceptions
conventions
Daenyth
fonte
fonte
obj.hashCode()
;-)Respostas:
Cuidado!
As asserções são removidas no tempo de execução, a menos que você especifique explicitamente para "habilitar asserções" ao compilar seu código. As asserções Java não devem ser usadas no código de produção e devem ser restritas a métodos privados (consulte Exceção vs Asserção ), pois espera-se que os métodos privados sejam conhecidos e usados apenas pelos desenvolvedores. Também
assert
lançará AssertionError queError
não se estendeException
e que normalmente indica que você tem um erro muito anormal (como "OutOfMemoryError", difícil de recuperar, não é?) Que você não deve tratar.Remova o sinalizador "enable assertions" e verifique com um depurador e você verá que não pisará na chamada de lançamento IllegalArgumentException ... já que esse código não foi compilado (novamente, quando "ea" for removido)
É melhor usar a segunda construção para métodos públicos / protegidos e, se você quiser algo que seja feito em uma linha de código, há pelo menos uma maneira que eu conheço. Eu pessoalmente uso do Spring Framework 's
Assert
classe que tem alguns métodos de controlo argumentos e que lance 'IllegalArgumentException' em caso de falha. Basicamente, o que você faz é:... Que de fato executará exatamente o mesmo código que você escreveu no seu segundo exemplo. Existem alguns outros métodos úteis, tais como
hasText
,hasLength
lá dentro.Não gosto de escrever mais código do que o necessário, por isso fico feliz quando reduzo o número de linhas escritas em 2 (2 linhas> 1 linha) :-)
fonte
java -ea
e programaticamente. @Jalayn eu acho que têm afirmações em código de produção é perfeitamente válido, como eles são úteis para depuração no campojava -ea
.Objects.requreNonNull
Você precisa usar uma exceção. Usar uma afirmação seria um uso indevido do recurso.
Exceções não verificadas são projetadas para detectar erros de programação dos usuários da sua biblioteca, enquanto asserções são projetadas para detectar erros em sua própria lógica. Esses são problemas separados que não devem ser misturados.
Por exemplo, uma asserção
significa "Eu sei que cada caminho de código que leva a essa afirmação garante que ele
myConnection
esteja conectado; se o código acima falhou ao obter uma conexão válida, ele deveria ter lançado uma exceção ou retornado antes de chegar a esse ponto".Por outro lado, um cheque
significa que "Chamar minha biblioteca sem estabelecer uma conexão é um erro de programação".
fonte
Se você estiver escrevendo uma função que não permita
null
como um valor de parâmetro válido, adicione a@Nonnull
anotação à assinatura e use-aObjects.requireNonNull
para verificar se o argumento énull
e lançar aNullPointerException
se for. A@Nonnull
anotação é para documentação e, em alguns casos, fornecerá avisos úteis em tempo de compilação. Isso não impede quenull
sejam passados em tempo de execução.Atualização: a
@Nonnull
anotação não faz parte da biblioteca padrão Java. Em vez disso, existem vários padrões concorrentes de bibliotecas de terceiros (consulte Qual anotação @NotNull Java devo usar? ). Isso não significa que é uma má idéia usá-lo, apenas que não é padrão.fonte
Objects.requireNonNull()
, o que era novo para mim. Você sabe se existe um método semelhante "requireTrue ()" ou "requireEqual ()" em algum lugar? Nada contra o Spring's Assert, mas nem todo mundo está usando isso.Objects.requireNonNull()
é para validação de argumentos. Se um argumento é necessário para sertrue
ou igual a algo, então o argumento é inútil. Para além argumentos ilegais casos de erro, você devethrow
umException
que descreve com mais precisão o erro. Também há JUnit,Assert
mas isso é para testes.Objects.requireTrue(x >= 0.0);
, ou para algum hash,Objects.requireEquals(hash.length == 256)
Eu sempre prefiro lançar IllegalArgumentException sobre asserções.
As asserções são usadas principalmente no JUnit ou em outras ferramentas de teste, para verificar / afirmar os resultados do teste. Portanto, pode dar uma falsa impressão a outros desenvolvedores de que seu método é um método de teste.
Também faz sentido lançar IllegalArgumentException quando um método recebe um argumento ilegal ou inapropriado . Isso é mais consistente com a convenção de tratamento de exceções seguida pelos desenvolvedores de Java.
fonte
O segundo da IMO é um pouco melhor porque traz mais informações e pode ser estendido ainda mais (por exemplo, estendendo a classe de exceção) para ser ainda mais informativo, também não usa comparação negativa que é mais fácil de entender.
fonte
Eu não uso muito aserts, mas uma abordagem comum com o Lombock @NonNull: https://projectlombok.org/features/NonNull
Implementação do Lombok: import lombok.NonNull;
Versão Java:
Lombok é realmente uma biblioteca bastante agradável que eu uso em todos os lugares
fonte