Exceção em um método

7 respostas
K

Olá, estou começando a programar um jogo de Pokemon (heheheheh) em java, bem básico, e me surgiu a seguinte dúvida:

Tenho um método que seta os atributos dos pokemons:

public void setField(int val, String fld){
    	String str = new String();
    	str = fld.toUpperCase();
    	
        if(val<0){
        	val = 0;
        }
        
        if(val>100){
        	val = 100;
        }
    	
    	if( str.equals("ATTACK") ){
    		this.attack = val;
    	}
    	else if( str.equals("DEFENSE") ){
    		this.defense = val;
    	}
    	else if( str.equals("SPECIAL ATTACK") ){
    		this.sp_attack = val;
    	}
    	else if( str.equals("SPECIAL DEFENSE") ){
    		this.sp_defense = val;
    	}
    }

Onde val é o valor que quero setar no atributo fld. Lembrando que attack, defense, sp_attack e sp_defense são atributos da classe pokemon.
Se o programador chamar setField(10, “attack”); ele estará setando 10 para o atributo attack.

Minha dúvida é: existe alguma exceção ou algum outro jeito de tratar um possível erro se o programador chamar o método com um fld que não existe, por exemplo, setField(10,“hello”); ?

7 Respostas

P

Ola,

Pelo que eu entendi, se por exemplo passar um numero negativo lançar um erro,certo (int)

Olha, eu acho que existem maneiras melhores, mas eu estou com muito sono, rsrsrs. Normalmente o pessoal usa Assertions para checar este tipo de problema. O uso de assertions é disponivel desde o Java2 1.4 .

Voce tambem poderia lançar um IllegalArgumentException no bloco de teste.

Mas eu acho que existe uma função mais específica para isso, nao estou lembrado agora.

Grato!

Ricna

Seria melhor você criar constatantes nessa classe, tipo:

private static final int ATTACK = 0; private static final int DEFENSE = 1; ......

Então usa um switch no lugar daquele monte de if…

public void setField(int val, int constanteDaClasse){

switch(fld){ case ATTACK: this.attack = val; break; ..... default: throw new Exception ("Valor inválido...etc"); }

Ricna

Ah… daí tem que mudar aqui:

public void setField(int val, int fld){

e para chamar o método

K

Vlw pelas dicas, vou tentar o IllegalArgumentException e usar static final.

K

Blz!!!

Vlw Ricna e Sergio. Alterei o código e usei static final, fica bem melhor mesmo. No fim IllegalArgumentException não funcionou, mas usei o default do switch pra lançar um warning, isso já é suficiente.

Obrigado!

Ricna

Blz Legal que resolveu…
Usar constantes é excelente prática, pois torna o código mais legível em casos como esse. Além disso você não passa strings entre as classes, e sim referência a atributos estáticos, permitindo que através de um boa definição, através do Javadoc, o método seja usado sempre de forma correta e legível.

sergiotaborda

ksoHunter:
Olá, estou começando a programar um jogo de Pokemon (heheheheh) em java, bem básico, e me surgiu a seguinte dúvida:

Tenho um método que seta os atributos dos pokemons:

public void setField(int val, String fld){
    	String str = new String();
    	str = fld.toUpperCase();
    	
        if(val<0){
        	val = 0;
        }
        
        if(val>100){
        	val = 100;
        }
    	
    	if( str.equals("ATTACK") ){
    		this.attack = val;
    	}
    	else if( str.equals("DEFENSE") ){
    		this.defense = val;
    	}
    	else if( str.equals("SPECIAL ATTACK") ){
    		this.sp_attack = val;
    	}
    	else if( str.equals("SPECIAL DEFENSE") ){
    		this.sp_defense = val;
    	}
    }

Onde val é o valor que quero setar no atributo fld. Lembrando que attack, defense, sp_attack e sp_defense são atributos da classe pokemon.
Se o programador chamar setField(10, “attack”); ele estará setando 10 para o atributo attack.

Minha dúvida é: existe alguma exceção ou algum outro jeito de tratar um possível erro se o programador chamar o método com um fld que não existe, por exemplo, setField(10,“hello”); ?

Vc pode simplesmente usar else

... // outro codigo acima
else if( str.equals("SPECIAL DEFENSE") ){
    		this.sp_defense = val;
} else {
         throw new IllegalArgumentException(str + " não é válido");
}

Uma forma mais simples de fazer o que vc quer é usar EnumMap e criar um Enum de attributos

public enum Attributs{

ATTACK,
DEFENCE,
SPECIAL_ATTACK,
SPECIAL_DEFENCE
}

public class Mon {

EnumMap<Attribute , Integer> attributes = new EnumMap<Attribute , Integer>(Attribute.class);

public void setAttribute (Attribute attr , int value){
          this.put(attr, value);
}
}

Sim if, sem possibilidade de passar atributos que não existem , sem execções em poucas linhas de codigo

Criado 19 de julho de 2008
Ultima resposta 19 de jul. de 2008
Respostas 7
Participantes 4