Try/Catch para converter String em Integer

Olá, tenho o seguinte método que é usado para uma função de autocomplete em JSF. O objetivo dele é receber um valor que pode ser o codigo ou o nome da pessoa e efetuar a busca no banco de dados, caso o valor recebido seja o codigo ele faz a conversão para Integer. Minha dúvida é: posso usar o catch vazio dessa forma? Há como melhorar isso?

Obs: Ele funciona perfeitamente, só quero saber se tem formas mais adequadas de fazer.

    public List<PessoaVO> autoCompletePessoa(String value) {
		PessoaRN pessoaRN = new PessoaRN();
		Integer codPessoa = 0;
		try {
			codPessoa = Integer.parseInt(value);
			value = "";
		} catch (NumberFormatException e) {}
		return pessoaRN.listarPessoas(codPessoa, value);
	}

Grato

/*

  • What will happen if you enter another type such as a double, Object Float etc
  • This program creates a Person Object
  • The only two valid types are Strings and Integers
  • Depending on the Type it then sets the corresponding value of the Person object
  • One could make use of the Builder or Factory patterns to do this, but
  • I make use of two Wrapper Objects tone that wraps the String and the other that wraps the Integer
  • I had this implement interface ValidField.
  • The Person object just has a Valid field as a constructor parameter, thus restricting
  • the parameter to an Integer or a String
  • O que acontecerá se você inserir outro tipo, como duplo, objeto flutuante, etc.
  • Este programa cria um objeto Person
  • Os únicos dois tipos válidos são Strings e Inteiros
  • Dependendo do tipo, ele então define o valor correspondente do objeto Pessoa
  • Pode-se usar os padrões Builder ou Factory para fazer isso, mas
  • Eu utilizo dois tons de Wrapper Objects que envolvem a String e o outro que envolve o Integer
  • Fiz com que implementassem a interface ValidField.
  • O objeto Person tem apenas um campo Valid como parâmetro do construtor, restringindo assim
  • o parâmetro para um inteiro ou uma string

*/

public class Main {

public static void main(String... args)    {
		 ValidField value1 = new StringValue("Joao");
		 ValidField value2= new IntegerValue(123);

// ValidField value3= new Double(123.50); // does not compile

		  Person p1 = new Person(value1);
		  Person p2 = new Person(value2);
		  
		  System.out.println(p1);
		  System.out.println(p2);
	
	}

}
class Person {

ValidField field;
String name = "";
Integer code = 0;

Person(ValidField field){
	this.field = field;
	if(field == null) 
		throw new IllegalArgumentException("Must have a value");
	
	if(field.getValue() instanceof String)
		this.name = (String) field.getValue();
	else
		this.code = (Integer) field.getValue();
}

@Override
public String toString() {
	return "Person [name=" + name + ", code=" + code + "]";
}

}

// follwing interface and classes only will allow String and Integers
interface ValidField {
Object getValue();

}

class StringValue implements ValidField{
String value ;

StringValue(String value){
	this.value = value;

}

@Override
public String getValue() {
	
	return value;
}

}

class IntegerValue implements ValidField{
Integer value;

IntegerValue(Integer value){
	this.value = value;	
}

@Override
public Integer getValue() {
	
	return value;
}

}

Vou tentar adaptar para o meu caso, também vou estudar um pouco sobre design patterns, valeu

Também gostaria de saber a opinião das outras pessoas.

Particularmente, no seu caso, não vejo problema em deixar o catch vazio.

Vc poderia colocar só um printlnzinho ali nele só pra saber que caiu ali como um favor pra vc mesmo no futuro.

É que hoje vc sabe claramente que:

  • Se for um número, vai retornar pessoas com aquele código,
  • Se não, vai retornar pessoas com aquele nome

Mas um dia vc pode se confundir com os dados e se perder nos resultados.

Outra sugestão é separar a funcionalidade do método listarPessoas() em dois:

  • listarPessoasPorNome()
  • listarPessoasPorCodigo()

Assim:

public List<PessoaVO> autoCompletePessoa(String value) {
  PessoaRN pessoaRN = new PessoaRN();
  try {
    return pessoaRN.listarPessoasPorCodigo(Integer.parseInt(value));
  } catch (NumberFormatException e) {
    return pessoaRN.listarPessoasPorNome(value);
  }
}

é uma opção para não deixar o catch vazio, eu tinha feito algo parecido no inicio, mas achei que estava repetido e desnecessário, dai removi. Vou ter que verificar como fica a performance da busca, já que a base é imensa e a busca é feita de acordo com os caracteres inseridos

1 curtida

Você poderia testar com uma expressão regular se o valor recebido é numérico ou não, se for, você trata como código, senão, trata como nome.

Existem várias diretrizes para quando devemos usar exceções, e acredito que usar uma exceção para validar o tipo de entrada não é uma delas.
No livro “Effective Java” de Joshua Blosh, ele menciona esses, entre outros.
Use exceções apenas para condições excepcionais. Exemplo: não use uma exceção para encerrar uma matriz, entrada do usuário etc.
Embora eu veja que os designers de Java violam isso. por exemplo. EOFException em um ObjectInputStream para idicar o final dos dados
Use exceções capturadas para condições recuperáveis
Use exceções verificadas para condições recuperáveis ​​e exceções de tempo de execução para erros de programação
Não ignore as exceções

Então, no final, se você está escrevendo o programa e sabe o que ele faz e ninguém mais precisa trabalhar nele, então está tudo bem, pois ele funciona.
Mas, no mundo do trabalho, a manutenção pode se tornar um problema.
PS documenta as intenções de forma clara.
Observe que este é apenas o meu ponto de vista e com o que aprendi ao longo da minha jornada, e de forma alguma a maneira perfeita, como todos sabemos, a programação também é uma arte.