Try Catch que não para quando encontra uma excessão?

Olá pessoas, gostaria de saber como fazer um try catch que não parasse de “tentar” executar os codigos quando encontrasse uma excessão…
Por exemplo:

[code]public class TesteTryCatch {
static String teste="";
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try{
teste=“aaaaaaaaa”;
System.out.println(teste.trim());
teste=“bbbbbbbbbb”;
System.out.println(teste.trim());
teste=“cccccccc”;
System.out.println(teste.trim());
teste=null;
System.out.println(teste.trim());
teste=“dddddddddd”;
System.out.println(teste.trim());
teste=“eeeeeeeeeee”;
System.out.println(teste.trim());
}catch(Exception e){

    }
}

}[/code] O seguinte código tenta botar um trim() em cada string, quando ele tentar botar o trim() no momento em que a stirng for [color=blue]null[/color], ele vai gerar uma excessão, e vai parar por aí. Gostaria de saber se tem como ele continuar a tentar as outras strings mesmo depois de dar essa excessão. E eu não quero ter que fazer isso usando um try catch em cada vez que eu quiser fazer o trim.
Origado desde já.

Se não quer usar um try catch em cada então terá que verificar se a variavel não é nula.Caso contrário não consigo visualizar essa necessidade na prática.

boolean erro = false;
do
{
 try{
            teste="aaaaaaaaa";
            System.out.println(teste.trim());
            teste="bbbbbbbbbb";
            System.out.println(teste.trim());
            teste="cccccccc";
            System.out.println(teste.trim());
            teste=null;
            System.out.println(teste.trim());
            teste="dddddddddd";
            System.out.println(teste.trim());
            teste="eeeeeeeeeee";
            System.out.println(teste.trim());
            erro = false;
        }catch(Exception e){
            erro = true;
        }
}while(erro)

@leonardobhbr : seu algoritmo nao funciona pq ele repete sempre os passos antes da excessão. indefinidamente.

assim “funfeia”:

public class TesteTryCatch {

    public static void main(String[] args) {
        String[] testes = {"aaaaaaaaa",
                           "bbbbbbbbbb",
                           "cccccccc",
                           null,
                           "dddddddddd",
                           "eeeeeeeeeee"
        };
        for (String t : testes) {
            try {
                System.out.println(t.trim());
            } catch (Exception e) {
                System.out.println(">> Oops! vamos tentar a próxima.");
            }
        }
        System.out.println(">> Acabou.");
    }
}

[]s

O bloco try/catch é protegido.

Qualquer problema encontrado na codificação, ele sempre irá para a estrutura catch.

A sugestão do amigo acima é válida. Teste sempre se a referência é nula.

concordo com o nickdofeliperibeiro
forçar a execução após uma exceção ta mais pra POG q outra coisa
o ideal é não gerar a exceção sendo assim
testar se variavel é nula ou não é o melhor a se fazer.

Continuando com a ideia do jeffpalmares, com essa pequena modificação vc não precisará de try/catch, não usará biblioteca adicional e nem ifs.

System.out.println(String.valueOf(teste).trim());

Esse método até funciona só que ai ele vai retornar a seguinte saída:
aaaaaaaaa
bbbbbbbbbb
cccccccc
null
dddddddddd
eeeeeeeeeee
[color=green]CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)[/color]

A aplicação desse exemplo é a seguinte:
Estou puxando dados de um banco de dados, e quando puxo de um campo varchar(10) por exemplo, e se nesse campo tiver o valor “XXX”, eu vou obter o uma variavel de 10 posições aonde as primeiras 3 são “XXX” e as outras 7 são espaços vazios, dessa forma:“XXX_______”
e o meu codigo tenho centenas de campos, ficaria meio gambiarrão testar se todos eles forem nulos pra fazer o trim, e detalhe que se eu usar isso aqui:

System.out.println(String.valueOf(teste).trim());  

Ele vai me retornar uma string[color=orange] “null”[/color], e não um java [color=blue]null[/color].

se vc não quer fazer if em todos os campos (repetir o comando if) pq vc nao cria um método privado para isso?

algo tipo…

private String trimIfNotNull(String fieldValue) {
    if (fieldValue != null) {
        return fieldValue.trim();
    }
    return null;
}

e no seu código é só chamar esse método para qualquer campo do tipo String.
assim vc nao vai poluir seu codigo com ifs.

[]s

[quote=sf.marcius]se vc não quer fazer if em todos os campos (repetir o comando if) pq vc nao cria um método privado para isso?

algo tipo…

private String trimIfNotNull(String fieldValue) {
    if (fieldValue != null) {
        return fieldValue.trim();
    }
    return null;
}

e no seu código é só chamar esse método para qualquer campo do tipo String.
assim vc nao vai poluir seu codigo com ifs.

[]s[/quote]
Foi exatamente isso o que eu fiz, mas mesmo assim eu achei que ficou bem poluído, se eu passar isso pra outro programador o cara me enche de lixo rsrs…
Não tem algum jeito de editar o método trim() da classe String? assim eu poderia verificar se é nulo no proprio metodo trim().
Eu até tentei abrir a classe String no netBeans mas ele não deixa editar.

cara vc já tentou colocar o trim na consulta do banco??

Já. Foi por isso que eu criei esse tópico, pois caso no banco esteja null, ele vai me retornar um java null, o que geraria a excessão.
Além disso, como estou usando JDBC, tenho que usar um método getString([color=orange]“Nome do Campo”[/color]) pra cada campo que eu quiser pegar, então eu teria que poluir o código de qualquer forma.

[quote=mateusviccari][quote=sf.marcius]se vc não quer fazer if em todos os campos (repetir o comando if) pq vc nao cria um método privado para isso?

algo tipo…

private String trimIfNotNull(String fieldValue) {
    if (fieldValue != null) {
        return fieldValue.trim();
    }
    return null;
}

e no seu código é só chamar esse método para qualquer campo do tipo String.
assim vc nao vai poluir seu codigo com ifs.

[]s[/quote]
Foi exatamente isso o que eu fiz, mas mesmo assim eu achei que ficou bem poluído, se eu passar isso pra outro programador o cara me enche de lixo rsrs…
Não tem algum jeito de editar o método trim() da classe String? assim eu poderia verificar se é nulo no proprio metodo trim().
Eu até tentei abrir a classe String no netBeans mas ele não deixa editar.
[/quote]

seu código lá no topo está com cara de “teste”…
Na sua aplicação real, de onde vem os valores destes dados? formularios Swing? web?
os dados são setados em alguma Entidade? que será persistida em banco? arquivo?

pergunto isso pq quando eu quero garantir que as strings estejam “trimadas” eu uso uma das tres opções:

  • implemento um tipo customizado do hibernate que faz o trim pra mim (caso use hibernate e persista em db)
  • coloco o trim no metodo setter de cada atributo do tipo String da minha entidade.
  • ou eu implemento um validator que nao deixa o sujeito entar strings “nao normalizadas”

sem saber o objetvo real da tua aplicação é difícil de te dar uma idéia de onde fazer isso de uma forma mais transparente. :slight_smile:

[]s

Minha aplicação é pra gerar nota fiscal enetrônica, o banco que eu to puxando os dados e o sistema que grava essas informações no banco não são de meu controle, eu só tenho acesso às informações.
Eu estou usando JDBC, o banco é o firebird 1.5, eu faço através de um código tipo esse:

[code]String database = “jdbc:firebirdsql:localhost/3050:”+caminhoDoBanco; // jdbc:postgresql://localhost/locadoras eh o q deve ta dentro do arquivo
String usuario = “SYSDBA”;
String senha = “masterkey”;
String driverName=“org.firebirdsql.jdbc.FBDriver”;
Connection conexao;
Statement consulta;
ResultSet resultado;
String xml;
try{
Class.forName(driverName);
conexao = DriverManager.getConnection(database,usuario,senha);
consulta = conexao.createStatement();
resultado = consulta.executeQuery(“select XXX from YYY where ZZZZ”);
while(resultado.next()){
xml+=""+resultado.getString(“campo1”)+"";
xml+=""+resultado.getString(“campo2”)+"";
//etc
}

[/code]

e seria aquele “resultado.getString(“campo#”)” que nao vem trimado???

Exato. Eu não sei porque isso acontece, acontece também no Postgres.

eu faria assim…

    public static String busca(String caminhoDoBanco) throws Exception {
        String database = "jdbc:firebirdsql:localhost/3050:" + caminhoDoBanco; // jdbc:postgresql://localhost/locadoras eh o q deve ta dentro do arquivo   
        String usuario = "SYSDBA";
        String senha = "masterkey";
        String driverName = "org.firebirdsql.jdbc.FBDriver";
        Connection conexao;
        Statement consulta;
        ResultSet resultado;

        StringBuilder xml = new StringBuilder();

        Class.forName(driverName);
        conexao = DriverManager.getConnection(database, usuario, senha);
        consulta = conexao.createStatement();
        resultado = consulta.executeQuery("select XXX from YYY where ZZZZ");
        int i = 1;
        while (resultado.next()) {
            String nomeCampo = "campo" + i; // nome do campo. será sequencial: campo1 campo2, ...
            String valorCampo = resultado.getString(nomeCampo); // pega o valor do campo atual

            xml.append("<").append(nomeCampo).append(">");  // coloca <campo#>
            if (valorCampo != null) {
                xml.append(valorCampo.trim());              // coloca o valor do campo trimado
            }
            xml.append("</").append(nomeCampo).append(">"); // coloca </campo#>
            xml.append("\n"); // coloca uma nova linha
            i++;
        }
        return xml.toString();
    }

Bem…

Desculpe me a franqueza, mas acho que alguns estão fazendo confusões nas camadas.

Na verdade, eu ainda não entendi o problema.

Inicialmente, a questão era sobre a exceção.

Então, partiu-se para outra coisa.

Enfim, acho que a solução do sf.marcius é válida. Você poderia novamente resumir o problema?

Exato. Eu não sei porque isso acontece, acontece também no Postgres.[/quote]
Provavelmente os campos são CHAR na BD e não VARCHAR…

[quote=nickdofeliperibeiro]Bem…
Desculpe me a franqueza, mas acho que alguns estão fazendo confusões nas camadas.
Na verdade, eu ainda não entendi o problema.
Inicialmente, a questão era sobre a exceção.
Então, partiu-se para outra coisa.
Enfim, acho que a solução do sf.marcius é válida. Você poderia novamente resumir o problema?[/quote]

bem… o que eu entendi até aqui é que ele possui uma tabela que possui “campos”.
deseja ler esta tabela e gerar um xml no formato:

valor abc
valor d
valor efghi

no entanto está saindo

valor abc     
valor d
valor efghi

e eu acredito que ele está achando feio aqueles espaços no final da string (embora isso seja ok em um xml).
por isso ele quer fazer trim() dos valores, mas alguns valores são null, fazendo levantar uma exceção.
pelo jeito ele quer que quando o campo for null, ignore o trim() (deixa em branco, pra nao dar exceção), mas está achando “feio” colocar esses trims nas camadas superiores.

buenas… foi isso que entendi pelos códigos (principalmente o último) e explicações dele :stuck_out_tongue:

como o colega pmlm apontou, provavelmente as colunas da tabela são CHAR e não VARCHAR.