public static double sacar2(double valor) {//ao chamar o método deverá passar um valor
if(valor <= 0){
throw new NumberFormatException("Não pode ser 0 ou negativo!");
}
else{
saldo -= valor;
}
return valor;
}
poderia ser IllegalArgumentException? Qual outra poderia ser?
Eu usaria um IllegalArgumentException, pois um dos parametros de entrada está errado/invalido. Se fosse algo que pudesse alterar o estado dos meus objetos seria um IllegalStateException. Para os casos de parametros obrigatórios que estão nulos eu uso NullPointerException.
/**
* Saca da conta e retona o saldo.
*
* {@link NullPointerException} se for passado o valor do saque nulo.
*
* {@link IllegalArgumentException} se for passado o valor do saque negativo.
*
* {@linl ExcetionParticular} se o valor do saque for maior que o valor do saldo.
*
* @param valueToDraw valor a ser sacado.
* @return valor do saldo apos o saque.
*/
public Double drawAndGetBalance(final Double valueToDraw) {
if (valueToDraw == null) {
throw new NullPointerException("É necessario informar o valor a ser sacado.");
}
if (valueToDraw.doubleValue() <= 0) {
throw new IllegalArgumentException("O valor do saque deve ser possitivo.");
}
synchronized (this.balance) {
if (this.balance.doubleValue() < valueToDraw.doubleValue()) {
// Alguma exception propria da camada de negocio informando que 'O valor do saque é maior que o
// saldo'...
}
return this.balance = this.balance - valueToDraw;
}
}
/**
* Saca da conta e retona o saldo.
*
* {@link NullPointerException} se for passado o valor do saque nulo.
*
* {@link IllegalArgumentException} se for passado o valor do saque negativo.
*
* {@linl ExcetionParticular} se o valor do saque for maior que o valor do saldo.
*
* @param valueToDraw valor a ser sacado.
* @return valor do saldo apos o saque.
*/
public Double drawAndGetBalance(final Double valueToDraw) {
if (valueToDraw == null) {
throw new NullPointerException("É necessario informar o valor a ser sacado.");
}
if (valueToDraw.doubleValue() <= 0) {
throw new IllegalArgumentException("O valor do saque deve ser possitivo.");
}
synchronized (this.balance) {
if (this.balance.doubleValue() < valueToDraw.doubleValue()) {
// Alguma exception propria da camada de negocio informando que 'O valor do saque é maior que o
// saldo'...
}
return this.balance = this.balance - valueToDraw;
}
}
[/quote]
Ótima implementação, mas acho que esse synchronized não esta apropriado, neste momento return this.balance = this.balance - valueToDraw; antes de retornar outra thread poderia entrar no drawAndGetBalance, pois a trava usada é a do antigo this.balance e não do novo this.balance, logo após o método retorna um valor diferente ao chamador.
Ou então vc poderia criar usa própria exceção. Com isso, o seu sistema poderia trata-la como vc desejar.
throw new ValorInvalido("Favor digitar apenas número, e maior do que zero")
Lembre-se, ao utilizar um sistema que tenha um throw em runtime vc está utilizando a chamada programação Defensiva. Tem suas vantagens mas uma grande desvatagem é a poluição visual que seu código trará uma vez que para cada método chamado vc terá vários try/catch envolvido.
Na minha opinião não é necessário o uso de classes wrapper nesse caso, um tipo primitivo para o double já é suficiente, pois evitaria uma verificação a mais (valor == null).
A exceção mais apropriada é a IllegalArgumentException, não esqueçe de declarar um throws para ela pois ela é de runtime e não necessita de um tratamento obrigatório, porém é sempre bom deixar quem vai chamar o método ciente que algo pode acontecer.
[quote=jgavazzisp]Na minha opinião não é necessário o uso de classes wrapper nesse caso, um tipo primitivo para o double já é suficiente, pois evitaria uma verificação a mais (valor == null).
A exceção mais apropriada é a IllegalArgumentException, não esqueçe de declarar um throws para ela pois ela é de runtime e não necessita de um tratamento obrigatório, porém é sempre bom deixar quem vai chamar o método ciente que algo pode acontecer.
Por que você colocaria como parâmetro de entrada um Double ao invés do tipo primitivo double?
Se você não vai permitir nulos, então fazer isso não faz o menor sentido.