Aplicativo Swing fecha repentinamente

17 respostas
erasmo_tec

Bom dia

criei um aplicativo que lê as informaçções de um arquivo texto e insere numa base de dados MySql, o que ocorre o arquivo de texto tem sempre no minimo 8MB, quando criei o jar do aplicativo e coloquei na maquina do cliente el no meio da inserção fecha repentinamente não dando nem mensagen de erro, achei que era problema da VM e configurei no meu projeto alocando a memoria da VM para minimo 128 e maximo 1024. quando eu rodo a aplicação pelo netbeans ele roda normalmente, agora quando rodo pelo jara acontece isso.

Alguem sabe o que pode ser?

17 Respostas

T

Pode ser que a versão do Java usado no seu cliente seja diferente da versão que você está usando no seu Netbeans.

Se for diferente, desinstale a versão antiga que está no seu cliente, e instale a versão igualzinha à que você está usando no seu NetBeans.

erasmo_tec

verifiquei e as duas maquinas estão com a mesma versão. Java 6 Update 7, tanto na minha maquina quando no cliente…

T

Hum… é que já vi ocorrer a seguinte situação: quando você executa o seu programa dando um double-click no jar, ele chama uma JRE que não é a que você está esperando, e acaba dando problemas. (se você olhar no Iniciar->Painel de Controle->Adicionar ou Remover Programas, pode ser que você veja que estão instaladas na verdade N versões da JRE, por causa do "auto-update" do Java).

Outra coisa que pode estar ocorrendo é que o tal programa Swing esteja sem alguma biblioteca (.jar) que você sem querer usava no Netbeans e não está copiada no seu cliente. Se isso ocorrer, pode ser que em alguma parte da execução do seu programa, ele tente carregar a biblioteca e, em vez de dar um stack trace, seu programa simplesmente morra.

erasmo_tec

neste caso até poderia ser mas fiz os seguintes teste:

coloquei o jar para rodar na minha maquina e também aconteceu a mesma coisa.
com relação ao java a unica versão instalada é a citada acima não havendo atualizações até o momento

Será que não é algum problema com o bufferedReader que faz a leitura do arquivo?

fantomas

Se vc estiver executando o jar através de um duplo click, ao ocorrer o erro vc não terá tempo de ver a Stack Trace.

Abra uma seção DOS e execute na linha de comando e conta pra nós.

flws

erasmo_tec

eu tenho algum modo de analizar minha JVM em tempo de execução para saber se é estouro de memoria?

B

No tratamento de exceções ele não insere o ocorrido num log?

erasmo_tec

os erros possiveis eu coloquei para mostrar num JOPtionPane.ShowMessageDialog. tem uma maneira de ao fazer a leitura e quardar no buffer ele ir liberando esse buffer após fazer o insert no banco para não sobregarregar a JVM?

T

Uma coisa que pode estar ocorrendo é uma exceção em código nativo. Veja se é criado um arquivo com um nome parecido com “hs_err_0123.log” onde “0123” é o pid do processo. Se não estiver achando o arquivo de jeito nenhum, passe o parâmetro -XX:ErrorFile=c:\diretorio\arquivo.log na linha de comando do Java, onde “c:\diretorio\arquivo.log” é o path do arquivo onde será gerada a exceção.

http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/felog.html

B

Coloque também para ele imprimir o log na pasta da sua aplicação no HD do usuário.

Quanto a ir liberando o buffer

while ((buffer = ler()) != null) { objeto = processar(buffer); inserir(objeto); }
sendo que dentro do método de leitura ele cria um buffer com new, ou retorna um null caso não houver mais nada.

fantomas

erasmo_tec:
quando eu rodo a aplicação pelo netbeans ele roda normalmente, agora quando rodo pelo jara acontece isso.

Vc disse que executa o sistema no NetBeans (o engolidor de memória) e o erro não ocorre! :shock: Se isso é verdade então memória é que não pode ser.

O Termino da execução é baseada (por um acaso) em algum tipo de condição?

O arquivo utilizado no teste com NetBeans é o mesmo com o utilizado na execução externa? Pergunta boba mas fiz mesmo assim :lol:

flws

erasmo_tec

os arquivos são os mesmos...
agora o codigo que utilizo na leitura segue abaixo

public static void Leia(String arquivo) throws FileNotFoundException, IOException, ClassNotFoundException, SQLException {
        ConectaBanco conex = new ConectaBanco();

        BufferedReader naLinha = null;




        naLinha = new BufferedReader(new FileReader(arquivo));
        String linha = null;

        try {
            sqlDelete = "delete from kg_uf";
            conex.deletar(sqlDelete);
            while ((linha = naLinha.readLine()) != null) {
                String[] l = linha.split(";", -1);
                cpfCnpj = l[0];
                contrato = l[1];
                valorParcela = l[2];
                nomeDevedor = l[3];
                uf = l[4];
                int pos = nomeDevedor.indexOf("'");
                if (pos != -1) {
                    nomeDevedor = nomeDevedor.substring(pos, pos + 1);
                    nomeDevedor = "CONSULTAR NOME PELO CPF_CNPJ";
                
                }
                sqlInsert = "insert into kg_uf (cpfCnpj,contrato,valorParcela,nomeDevedor,uf) values('" + cpfCnpj + "','" + contrato + "','" + valorParcela + "','" + nomeDevedor + "','" + uf + "')";
                //Logs.criaLog();
                conex.inserir(sqlInsert);

            }
            naLinha.close();
            JOptionPane.showMessageDialog(null, "Dados inseridos com sucesso");

        } catch (IOException err) {
            JOptionPane.showMessageDialog(null, err);
        }
    }

como eu passo esse parametro XX:ErrorFile=c:\diretorio\arquivo.log na linha de comando?

T
java -classpath jar1.jar;jar2.jar;jar3.jar -XX:ErrorFile=c:\diretorio\arquivo.log -jar SeuJar.jar
fantomas

Se essa execução na linha de comando não mostrar nenhuma mensagem no console e nem neste log vou chorar rsrsrsrsr.

flws

fantomas

Então erasmo_tec, o teu código tem umas coisas que chamam minha atenção:

  1. Tem o throws no cabeçalho do método com as seguintes classes:
    FileNotFoundException, IOException, ClassNotFoundException, SQLException

    O loop que vc montou está sob o domínio de um try catch para IOException, no meu entender se ocorrer uma exception do tipo SQLException (que não é difícil no seu caso) ela será lançada para frente (por causa do throws) e SE neste momento vc não tiver um try cach que envolve a execução do método “Leia” esperto o suficiente para mostrar esta exception vc não irá ve-la mesmo.

    Acho que o try catch no método é desnecessário, pelo fato de vc já ter um controle bacana na chamada do método (ESTOU ASSUMINDO ISSO)

  2. Sinto falta do COMMIT / ROLLBACK, o banco está controlando isso automaticamente? Entendi que este processo envolve uma boa quantidade de dados acho que merece uma atenção especial aqui.

  3. Uma variável com esse nome não é uma boa prática parece o número 1 (um) tente evitar isto.

    String[] l = linha.split(";", -1);
    

flws

erasmo_tec

Refiz o projeto novamente e o erro que está acontecendo é um erro nativo do java…

agora como eu posso resolve-lo, não faço a menor idéia de como tratar isso…

erasmo_tec

Alguem sabe como tratar erros nativos em java

Criado 12 de novembro de 2008
Ultima resposta 14 de nov. de 2008
Respostas 17
Participantes 4