Erro no FOR

41 respostas
ArianeRebellato

Tenho um código funcionando até chegar no for…não consigo achar o erro…se alguém achar algo e puder me ajudar, agradeço!

for (int i = vignorar; i < conteudo1.size(); i++){                                                                        
                        linha = conteudo1.get(i).toString();                       
                        
                        v_data=0;
                        v_data = (int) cont/v_horasDia;
                        
                        vhora = cont - (v_data*v_horasDia);
                        System.out.println("teste 141");
                        
                        Calendar c= Calendar.getInstance();
                        c.add(Calendar.DATE, v_data);
                        
                        h.set(Calendar.HOUR_OF_DAY,vhora);
                            
                        sql="insert into dados_climaticos_variaveis";
                        sql+="(dado_climatico, variavel, tipo_dado, valor_dado, data, hora)";
                        sql+=" values (" + v_cod + ", " + v_variavel + ", " + v_tipoDados+",) ";
                        
                        
                                                                         
                        if (v_tipoDados.equals("1")) //data
                        {
                            
                        }

                        if (v_tipoDados.equals("2")) //inteiro
                        {
                            
                        }
                        
                        if (v_tipoDados.equals("3")) //double
                        {
                            vvalor = Double.parseDouble(linha.substring(vinicial , vfinal));
                            
                            if (v_conversao!=0)
                                vvalor = conversao(vvalor,v_operadorConversao,v_conversao);
                            
                            sql+= "row("+ 0 +","+vvalor+","+null+","+null+","+null+")";
                        }                        

                        if (v_tipoDados.equals("4")) //text
                        {
                            
                        }

                        if (v_tipoDados.equals("5")) //hora
                        {
                            
                        }       
                        sql+=",'"+c.get(Calendar.DAY_OF_MONTH)+"/"+(c.get(Calendar.MONTH)+1)+"/"+c.get(Calendar.YEAR)+"', '"+ h.get(Calendar.HOUR_OF_DAY)+":00" +"')";
                        cont=cont+1;
                        s_busca1.execute(sql);                        
                    }  //fecha o for

41 Respostas

ArianeRebellato

Não chega nem até a linha de teste :?

ViniGodoy

Não dá nenhuma exception? Se der, poste o texto da exception aqui.

Já tentou usar um depurador?

nel

E que tal usar StringBuffer para a sua variavél sql?
Não seria mais adequado?

E complementado o que o Vini disse, creio que o ideal seja postar a classe que contenha este método apresentado por você :slight_smile:

Abraços.

ArianeRebellato

pzé…não tem…devria ter? Eu não sei como usar um depurador…tenho que botar este código pra funcionar…mandar as indformações do meu arquivo txt pra esta tabela do banco…Tu é meu salvador Vini! Alguma idéia? :lol:

ArianeRebellato

nel

Pensei em postar td…mas é meio comprido…devo postar??

nel

Edit: sim, tanto a classe completa quanto a exception :slight_smile:

ViniGodoy

Você usa o netbeans? Se usa, veja:

Se for o eclipse, veja:

É bem fácil, ele vai deixar seu código correr passo-a-passo.

E por acaso você tem algo como

try { //Código aqui catch (Exception e) { }

No seu código? Se tiver, isso pode estar impedindo você de ver o erro.

Carlos_ds_jar

Faz o seguinte tenta imprimir antes do for o valor das variáveis vignorar e conteudo.size(), depois diz aí pra gente quanto é :idea:

ViniGodoy

Outra coisa. É uma boa prática usar o PreparedStatement para salvar no banco, e não concatenar Strings como você está fazendo.
Aí o próprio banco se preocupa em converter um Date para o formato do banco, por exemplo.

ArianeRebellato

eu vou colar td…não se assustem!

package leituradados.ariane;

import java.net.*;
import java.io.*;
import java.sql.*;
import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;
import java.text.SimpleDateFormat;

//importa as estacoes do modelo de simulação cadastrado com código 3

public class ImportaAriane {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd00");
    SimpleDateFormat sdfDateTime = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    SimpleDateFormat sdfJul = new SimpleDateFormat("yyyyDDD");
    SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
    String v_sigla="", v_estacaoOrg="";
    int v_atualizado=0;

    public void ImportaAriane()
    {
        ArrayList dadosEstacoes = new ArrayList();
        String sql="", vcaminho="", linha="", varquivo="", v_variavel="", v_tipoDados="", sql1="", v_operadorConversao="";
        ResultSet rs_estacoes, rs_modelos, rs_cod;
        int vmodelo, vtipo_importacao, vignorar, vinicial, vfinal, vflag, v_nroDias, v_horasDia, vflag1, v_cod=0, v_estacao = 0;        
        int v_faixaEstacao;
        Double vvalor=0.0, v_conversao;
        ArrayList conteudo1 = new ArrayList();
        Statement s_busca;
        Statement s_busca1;

        try{  
           sql="select caminho_arquivos, codigo from modelos_simulacoes where codigo=3";
//            
            PoolCon.conecta();
  //
            rs_modelos = PoolCon.executeQuery(sql);
            while (rs_modelos.next())
            {
                vcaminho = rs_modelos.getString("caminho_arquivos");
                vmodelo = rs_modelos.getInt("codigo");             
//                
                s_busca = PoolCon.getStatement();
             
//               
                
                sql="";
                sql+="select caminho_arquivos, posicao_inicial, posicao_final, conversao, operador_conversao, ";
                sql+="tipo_importacao, linhas_iniciais, estrutura_arquivo, nro_dias, horas_dia, tipo_dado, variavel ";
                sql+="from modelos_simulacoes ms, modelos_simulacoes_variaveis msv, variaveis";
                sql+=" where ms.codigo=msv.modelo_simulacao and msv.variavel=variaveis.codigo and msv.importa='S' and ms.codigo="+vmodelo;
                
                rs_modelos = s_busca.executeQuery(sql);
                   System.out.println("foi 56");
//                
                vflag=0;     
                vflag1=0;
                String fileName = v_sigla + "_" + sdfDateTime.format(new Date()) + ".dat";
//
                s_busca = PoolCon.getStatement();
//                        
                sql="select nextval('id_dados_climaticos_previsoes');";
                rs_cod = s_busca.executeQuery(sql);
                rs_cod.next();
                       
                v_cod=0;
                v_cod = rs_cod.getInt("nextval");                       
                v_estacao = vmodelo;                            
                        
                Calendar cale= Calendar.getInstance();
                                                                        
                sql = "insert into dados_climaticos_previsoes (codigo,modelo_simulacao, estacao, data_importacao, hora_importacao) values ";
                sql+= "("+ v_cod + "," + vmodelo +  "," + v_estacao + ", '";
                sql+= cale.get(Calendar.DAY_OF_MONTH)+"/"+(cale.get(Calendar.MONTH)+1)+"/"+cale.get(Calendar.YEAR)+"', '"; 
                sql+= sdfTime.format(cale.getTime())+"')";
                s_busca.execute(sql);
                System.out.println("foi linha 79");
                
                while (rs_modelos.next())                    
                {     
                    int v_tamanhoarquivo=0;
                    
                    varquivo = rs_modelos.getString("estrutura_arquivo");
                    
                    vtipo_importacao=rs_modelos.getInt("tipo_importacao");
                    vcaminho=rs_modelos.getString("caminho_arquivos");
                    vignorar=rs_modelos.getInt("linhas_iniciais");
                    vinicial=rs_modelos.getInt("posicao_inicial");
                    vfinal=rs_modelos.getInt("posicao_final");
                    
                    v_nroDias=rs_modelos.getInt("nro_dias");
                    v_horasDia = rs_modelos.getInt("horas_dia");
                    
                    v_tipoDados = rs_modelos.getString("tipo_dado");
                    v_variavel = rs_modelos.getString("variavel");
                    
                    v_conversao = rs_modelos.getDouble("conversao");
                    v_operadorConversao = rs_modelos.getString("operador_conversao");
                    
                    if ((vtipo_importacao==1) && (vflag==0)) //trata como um arquivo de acesso local
                    {            
                        System.out.println(vcaminho+fileName);
                        conteudo1 = lerLocal(vcaminho+fileName);     
                        vflag=1;
                       
                    }
                                                                                    
                    if ((vtipo_importacao==2) && (vflag==0)) //trata como uma url
                    {                        
                        conteudo1 = readDataURL(vcaminho, fileName);     
                        vflag=1;                                                                                                
                    }

                                                            
                    Calendar cal = Calendar.getInstance();
                    cal.set(Calendar.HOUR_OF_DAY, 0);
                    cal.set(Calendar.MINUTE, 0);
                    cal.set(Calendar.SECOND, 0);
                    cal.add(Calendar.HOUR_OF_DAY, 1);                                        
                                       
                    int v_data=0;
                    int vhora=0;
                    int cont=0;


                    Calendar h=Calendar.getInstance();                                        
                     
                    s_busca1 = PoolCon.getStatement();
                     System.out.println("foi linha 131");
                     
                     
                    for (int i = vignorar; i < conteudo1.size(); i++){                                                                        
                        linha = conteudo1.get(i).toString();                       
                        
                        v_data=0;
                        v_data = (int) cont/v_horasDia;
                        
                        vhora = cont - (v_data*v_horasDia);
                        System.out.println("foi linha 141");
                        
                        Calendar c= Calendar.getInstance();
                        c.add(Calendar.DATE, v_data);
                        
                        h.set(Calendar.HOUR_OF_DAY,vhora);
                            
                        sql="insert into dados_climaticos_variaveis";
                        sql+="(dado_climatico, variavel, tipo_dado, valor_dado, data, hora)";
                        sql+=" values (" + v_cod + ", " + v_variavel + ", " + v_tipoDados+", ";
                        
                        System.out.println("foi linha 152");
                                                                         
                        if (v_tipoDados.equals("1")) //data
                        {
                            
                        }

                        if (v_tipoDados.equals("2")) //inteiro
                        {
                            
                        }
                        
                        if (v_tipoDados.equals("3")) //double
                        {
                            vvalor = Double.parseDouble(linha.substring(vinicial , vfinal));
                            
                            if (v_conversao!=0)
                                vvalor = conversao(vvalor,v_operadorConversao,v_conversao);
                            
                            sql+= "row("+ 0 +","+vvalor+","+null+","+null+","+null+")";
                        }                        

                        if (v_tipoDados.equals("4")) //text
                        {
                            
                        }

                        if (v_tipoDados.equals("5")) //hora
                        {
                            
                        }       
                        sql+=",'"+c.get(Calendar.DAY_OF_MONTH)+"/"+(c.get(Calendar.MONTH)+1)+"/"+c.get(Calendar.YEAR)+"', '"+ h.get(Calendar.HOUR_OF_DAY)+":00" +"')";
                        cont=cont+1;
                        s_busca1.execute(sql);                        
                    }  //fecha o for
System.out.println("fim do for ok");
                } //fecha o while 
                        
            PoolCon.desconecta();                    
        }
        }
        catch (Exception e){   
        }
        System.out.println("fim!");
    }

    
    
    public ArrayList lerLocal(String vcaminho)
    {
        ArrayList conteudo = new ArrayList();      
        try
        {      
            File f = new File(vcaminho);
            BufferedReader in = new BufferedReader(new FileReader(vcaminho));
            String inputLine;
            while ((inputLine = in.readLine()) != null) 
            {
                if (!inputLine.trim().equals(""))
                {
                    conteudo.add(inputLine);
                }
            }                        
            in.close();                          
        }
        catch (Exception e) { }
        return conteudo;
    } 
        
    public Double conversao(Double  valor, String operador, Double valorConversao)
    {
        if (operador.equals("-") )
            valor=valor - valorConversao;

        if (operador.equals("*") )
            valor=valor - valorConversao;

        if (operador.equals("/") )
            valor=valor / valorConversao;
        
        if (operador.equals("+") )
            valor=valor + valorConversao;
        
        return valor;
    }
    
    public ArrayList readDataURL(String vcaminho, String vfileName) 
    {
        ArrayList conteudo = new ArrayList();
        String linha = "";
        try 
        {
            String fileName = (vcaminho + vfileName);

            URL yahoo = new URL(fileName);

            BufferedReader in = new BufferedReader(new InputStreamReader(yahoo.openStream()));

            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                if (!inputLine.trim().equals("")) {
                    conteudo.add(inputLine);
                }
            }
            in.close();
        } catch (Exception e) 
        {
            System.out.println("Erro lendo URL: " + e);
        }
        return conteudo;
    }

    
    public static void main(String[] args) 
    {                
          ImportaAriane r = new ImportaAriane();
          r.ImportaAriane();
    }
}
ArianeRebellato

o [size=18]vignorar [/size]recebe a variável linha inicial que é igual as linhas do início que devem ser ignoradas…não devem valer pros campos do banco…pq td informação é separada por numero de caracteres…

nel

E a Exception?
Ou não ocorre nenhuma? :slight_smile:

ArianeRebellato

nesta classe é isso que tem…

ViniGodoy

Troque:

catch (Exception e){ }

Por:

catch (Exception e){ e.printStackTrace(); }

Aliás, nunca faça o catch daquela forma. Isso “engole” as mensagens de erro e deixa vc sem informação de como corrigi-lo.

Quando o java imprimir a exception, poste ela para nós.

nel

Não é isso…quando executa o seu sistema, não ocorre nenhum erro?
Você disse que não passa do for, perfeito? Então, deve estar gerando alguma Exception, não está? :slight_smile:

ViniGodoy

nel:
Não é isso…quando executa o seu sistema, não ocorre nenhum erro?
Você disse que não passa do for, perfeito? Então, deve estar gerando alguma Exception, não está? :)

Deve dar, mas ela engole os erros nas linhas 193 e 217, com o

catch (Exception e) {}
ArianeRebellato

ViniGodoy

Ahh sim…já estudei sobre o PreparedStatement esta semana…no código esta sendo usado o Statement…foi até aqui no fórum que eu vi a diferença entre os dois…o negócio é que este código não é só meu…eu queria mecher só o necessário pra botar funcionar…mas muuuito obrigada pela dica !! :smiley:

ArianeRebellato

não acusa erro nenhum…mas o que ta dentro do for não imprime…

init:
deps-jar:
Compiling 1 source file to C:\LeituraDados\build\classes
Note: C:\LeituraDados\src\leituradados\ariane\ImportaAriane.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
compile-single:
run-single:
Conectado: jdbc:postgresql://localhost/vacaria
foi 56
foi linha 79
C:/Ariane/arq1.txt_09/09/2010 16:49:19.dat
1
fim do for ok
1
fim do for ok
1
fim do for ok
1
fim do for ok
1
fim do for ok
fim!
fim de td!!
BUILD SUCCESSFUL (total time: 0 seconds)

****o um é o valor do vignorar

nel

ViniGodoy:
nel:
Não é isso…quando executa o seu sistema, não ocorre nenhum erro?
Você disse que não passa do for, perfeito? Então, deve estar gerando alguma Exception, não está? :)

Deve dar, mas ela engole os erros nas linhas 193 e 217, com o

catch (Exception e) {}

Tens razão, não havia visto estas linhas.

Está vendo as linhas acima citadas pelo Viny?
Faça nelas e.printStackTrace() que deve gerar algo sim.

ArianeRebellato

é verdade…deu sim…ah meu deusx! :shock:

nel

Eu ri agora rs…deve ser novata, porque eu já me acostumei! rs…
Então, agora sim, poste o que gerou esse print :slight_smile:

ViniGodoy

Por isso eu falei, muito cuidado com o

catch (Exception e) {}

Ele faz a mensagem de erro sumir. E você fica sem informação de que problema deu e em que linha.
No lugar, o ideal é relançar a exceção ou trata-la. Esses artigos ajudam você a entender como isso funciona:



ArianeRebellato

ahuahuahu…novata eu? imagina!! sou mirinzona mesmo!!

acho que o erro ta aqui…BufferedReader in = new BufferedReader(new FileReader(vcaminho));…no método lerLocal…

init:

deps-jar:

Compiling 1 source file to C:\LeituraDados\build\classes

Note: C:\LeituraDados\src\leituradados\ariane\ImportaAriane.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

compile-single:

run-single:

Conectado: jdbc:postgresql://localhost/vacaria

foi 56

foi linha 79

C:/Ariane/arq1.txt_09/09/2010 16:55:28.dat

java.io.FileNotFoundException: C:\Ariane\arq1.txt_09\09\2010 16:55:28.dat (O sistema não pode encontrar o caminho especificado)

1

fim do for ok

1

at java.io.FileInputStream.open(Native Method)

fim do for ok

1

fim do for ok

1

fim do for ok

at java.io.FileInputStream.(FileInputStream.java:106)

at java.io.FileInputStream.(FileInputStream.java:66)

at java.io.FileReader.(FileReader.java:41)

at leituradados.ariane.ImportaAriane.lerLocal(ImportaAriane.java:206)

at leituradados.ariane.ImportaAriane.ImportaAriane(ImportaAriane.java:105)

1

fim do for ok

fim!

fim de td!!

at leituradados.ariane.ImportaAriane.main(ImportaAriane.java:269)

BUILD SUCCESSFUL (total time: 0 seconds)
ArianeRebellato

não ta achando meu arquivo…é isso??

ViniGodoy
Ops, olha ali o nome do seu arquivo:
C:\Ariane\arq1.txt_09[code]C:\Ariane\arq1.txt_09\09\2010 16:55:28.dat
9010 16:55:28.dat[/code]

Isso está mesmo certo? Pq algumas \ devem estar sendo interpretadas como diretórios. Ele está dizendo que esse arquivo não existe.

Verifique o código que monta a String que gera o nome do arquivo.

nel

Edit: o Viny respondeu acima.

ArianeRebellato

troquei pra String fileName = v_sigla + “_” + sdf.format(new Date()) + “.dat”;

e…

C:/Ariane/arq1.txt_2010090900.dat

java.io.FileNotFoundException: C:\Ariane\arq1.txt_2010090900.dat (O sistema não pode encontrar o arquivo especificado)

at java.io.FileInputStream.open(Native Method)
ArianeRebellato

pzéé…eu encarnei neste vsigla antes…ele ta só inicializado valendo zero…

nel

Não existe um arquivo com o nome arq1.txt_2010090900.dat certo?
Se existe, com certeza o diretório está errado :slight_smile:

Veja como está montando o caminho para o seu arquivo, com certeza é isso.

ArianeRebellato

não…o arquivo é arq1.txt

mas então pq existe esta ali ?
String fileName = v_sigla + “_” + sdf.format(new Date()) + “.dat”;

o meu vcaminho tem td informação??

ArianeRebellato

gentee…tá…não dá mais erro nenhum…vcs são o máximo…mas tbm não incluiu nada na minha tabela…daquele insert de dentro do for…

ArianeRebellato

esta String fileName só existe se o arquivo for uma URL…o que não é o caso…mas e se fosse??

ArianeRebellato

não…mas não ta certo ainda…o fim do for não imprime…nem o fim do while…

e eu fiquei falando sozinha… :oops:

nel

rs…

Bom, primeiro, se tem "+ sdf.format(new Date()) + “.dat”; " no nome do arquivo você deve saber o motivo ou conversar com quem desenvolveu este código.
Sobre URL, como assim?

Basta passar o diretório no qual está contido o arquivo, simples assim.
Sobre não estar imprimindo, é porque você ainda deve estar “engolindo” alguma excessão.

Aonde tiver o try { } catch() { } você adiciona o printStackTrace() porque deve estar gerando exceção e não estamos vendo ela:)

ArianeRebellato

sim nel…denovo, tu tens razão!

o erro indicou esta linha

if (v_tipoDados.equals(3)) //double

{

vvalor = Double.parseDouble(linha.substring(vinicial , vfinal));

e o v_tipoDado é 3 mesmo…

init:

deps-jar:

Compiling 1 source file to C:\LeituraDados\build\classes

Note: C:\LeituraDados\src\leituradados\ariane\ImportaAriane.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

compile-single:

run-single:

Conectado: jdbc:postgresql://localhost/vacaria

foi 56

foi linha 79

1

C:/Ariane/arq1.txt_2010090900.dat

foi linha 144

java.lang.NumberFormatException: empty String

foi linha 152

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:994)

3    [color=red]tipo do dado[/color]

20, 20 [color=red]valor inicial e final[/color]

fim!

fim de td!!

at java.lang.Double.parseDouble(Double.java:510)

at leituradados.ariane.ImportaAriane.ImportaAriane(ImportaAriane.java:171)

at leituradados.ariane.ImportaAriane.main(ImportaAriane.java:275)

BUILD SUCCESSFUL (total time: 0 seconds)
luistiagos

em um “megazord” (http://desciclo.pedia.ws/wiki/Gambi_Design_Patterns#Mega_Zord) desses não me impressiono que vc esteja se perdendo… expremente em modularizar um pouco mais seu codigo… lembre-se um grande problema se resolve dividindo seu problema em varios probleminhas e resolvendo os probleminhas… então invez de criar um unico metodo gigantesco q faz tudo expremente fazer varios metodos menores ou até classes que fazem seu papel…

nel

Simples, esta linha linha.substring(vinicial , vfinal) ou método, como preferir, te retorna uma string vazia.
Em seguida, você efetua um parser, logo, não é válido e gera a exceção.

Não é por nada, este código está uma grande bagunça e sinceramente, faço das palavras do Luis as minhas, ou seja, divida esta classe em métodos separados afim de facilitar o entendimento do código, elegibilidade e até mesmo, qualidade. Ok?

Abraços!!

ArianeRebellato

Luis Tiago
huauahahu…verdade mesmo…adoro a desciclpédia…
Tô com raiva deste código já…ehehe

ArianeRebellato

Eu não sei como separar mais do que já está separado…na verdade, eu já olhei tanto pra este código que eu não vejo bagunça nenhuma…ehehe…mas é óbvio que vcs devem saber do que estão falando…eu só sou pesquisadora ainda…to na faculdade…conheço java a pouco tempo…menos de um ano…

não sei se eu falei antes…mas estou estudando o código e pesquisando uma maneira de fazer ele funcionar…

cm assim empty string?
o v_inicial e o v_final recebem a posição inicial e a posição final da variável que ta contida na linha do meu arquivo de texto…

“01-01-2009 00:00”;“0.0”;“0”;“0.0”;“0”
e o vvalor recebe isso td…

o conteudo1.size() é 17806 (linhas)

aaaaaaaaaa…grande bagunça…concordo cada vez mais!!

ArianeRebellato

o v_inicial e o v_final recebem a posição inicial e a posição final da variável que ta contida na linha do meu arquivo de texto…

“01-01-2009 00:00”;“0.0”;“0”;“0.0”;“0”

01 ao 17 - data/hora
17 ao 19 - temperatura
etc…

isso td já tenho cadastrado na tabela do banco

nel

Olá.

Empty String = “”, ou seja, uma string vazia e sem conteúdo.
Lógico, vazia é sem contéudo, mas o problema é que muitos esquecem que o espaço em branco é um caracter, exemplo:

String s = "";
System.out.println(s.isEmpty());

String s1 = " ";
System.out.println(s1.isEmpty());

O que acha vai acontecer ai? :slight_smile:
Por isso eu sempre que verifico se uma string é vazia eu utilizo o método trim.
Mas assim, ele tenta fazer um parser de uma String com o contéudo assim: “”. Fazer um parser disto para um Double gera a exceção relatada por você.

Volto a dizer, separa, define funções, como separar o arquivo em linhas e etc em métodos, caso contrário, vai ficar complicado.
Dê um System.out.println() nas variaveis:

linha, v_inicial, v_final, e no método linha.lenght().

Abraos.

Criado 9 de setembro de 2010
Ultima resposta 10 de set. de 2010
Respostas 41
Participantes 5