Dando continuidade bloco try/catch depois de gerar exception[RESOLVIDO]

Boa noite!

Estou com uma duvida besta eu acho hehe…

tenho um loop for onde eu percorro um array executando metodos para cada um deles…

dentor do loop tem um bloco/trycatch. Quando ocorre uma exception em 1 item do array ele para de fazer o loop.

Eu gostaria que se desse uma exception ele continuasse na prox array!

como eu faria isso?

segue minha classe

int  tamanhoList = listArq.getModel().getSize();
        String[] listArquivos = new String[tamanhoList];
        for (int i = 0; i < listArquivos.length; i++) {
            listArquivos[i] = listArq.getModel().getElementAt(i).toString();

            try {
                try {
                Nfs nf = ler.lerNF(new File(listArquivos[i]));
                // Cria channel na origem
                FileChannel oriChannel = new FileInputStream(listArquivos[i]).getChannel();
                // Cria channel no destino
                FileChannel destChannel = new FileOutputStream("d:\temp\"+nf.getPath()+".xml").getChannel();
                // Copia conteúdo da origem no destino
                destChannel.transferFrom(oriChannel, 0, oriChannel.size());
                ftp.transmite("d:\temp\"+nf.getPath()+".xml");
                // Fecha channels
                oriChannel.close();
                destChannel.close();

                dao.gravar(nf);

                File del = new File("d:\temp\"+nf.getPath()+".xml");
                del.deleteOnExit();
                } catch (Exception e) {
//parou no catch "/
                 }

finally?

Boa noite a todos.

Que tal voce utilizar o finally assim:


        int  tamanhoList = listArq.getModel().getSize();  
        String[] listArquivos = new String[tamanhoList];  
        for (int i = 0; i < listArquivos.length; i++) {  
            listArquivos[i] = listArq.getModel().getElementAt(i).toString();  
            try {  
                      Nfs nf = ler.lerNF(new File(listArquivos[i]));  
                      // Cria channel na origem  
                      FileChannel oriChannel = new FileInputStream(listArquivos[i]).getChannel();  
                      // Cria channel no destino  
                      FileChannel destChannel = new FileOutputStream("d:\temp\"+nf.getPath()+".xml").getChannel();  
                      // Copia conteúdo da origem no destino  
                     destChannel.transferFrom(oriChannel, 0, oriChannel.size());  
                     ftp.transmite("d:\temp\"+nf.getPath()+".xml");  
                     // Fecha channels  
                     oriChannel.close();  
                     destChannel.close();  
                     dao.gravar(nf);  
  
                     File del = new File("d:\temp\"+nf.getPath()+".xml");  
                     del.deleteOnExit();  
            } catch (Exception e) {  
                     e.printStackTrace();
                     JOptionPane.showMessageDialog(null, e.getMessage());  
            } finally {
                     continue;
            }
      }

O bloco finally é um bloco protegido que garante a execução do programa havendo exceção ou não e a instrução continue desvia o fluxo de execução para a próxima interação do loop for

perfeita explicação discorpio … Obrigado por contribuir,

e peço desculpas se minha resposta foi um tanto quanto inútil =x

abraços

Muito bom, as vezes meio besta pra uns hehe…

@d34d_d3v1l valeu sua resposta nao foi inutil nao hehe

outra coisa, eu fiz o teste aqui e deu certo…

porém nao tem como eu pegar quais posições deram certo e quais não deram?

[quote=d34d_d3v1l]perfeita explicação discorpio … Obrigado por contribuir,

e peço desculpas se minha resposta foi um tanto quanto inútil =x

abraços[/quote]

Olá d34d_d3v1l

Não achei a sua resposta inútil. Curta ou pequena talvez, mas não inútil.

Lembre-se de que as grandes profecias, poesias, frases já proferidas por personagens da história antiga, média, moderna e conteporânea, não são aquelas que estão em extensas palavras e frases. mas sim são aquelas que apesar de curtas, expressam uma grande profundidade de sentimentos.

Você quer um exemplo.

[quote=jeloy]Muito bom, as vezes meio besta pra uns hehe…

@d34d_d3v1l valeu sua resposta nao foi inutil nao hehe

outra coisa, eu fiz o teste aqui e deu certo…

porém nao tem como eu pegar quais posições deram certo e quais não deram?[/quote]

Olá Jeloy.

Neste caso voce terá que colocar dentro do bloco try…catch um outro tratamento de exceção que é o IOException, que reporta erro no caso de haver um erro com FileInputStream.

Ué :!: :!: :!:

Eu posso fazer mais de um tratamento de exceção dentro do bloco try…catch :?: :?: :?:

Sim. Eis o exemplo.

int  tamanhoList = listArq.getModel().getSize();    
String[] listArquivos = new String[tamanhoList];    
for (int i = 0; i < listArquivos.length; i++) {    
    listArquivos[i] = listArq.getModel().getElementAt(i).toString();    
    try {    
              Nfs nf = ler.lerNF(new File(listArquivos[i]));    
              // Cria channel na origem    
              FileChannel oriChannel = new FileInputStream(listArquivos[i]).getChannel();    
              // Cria channel no destino    
              FileChannel destChannel = new FileOutputStream("d:\temp\"+nf.getPath()+".xml").getChannel();    
              // Copia conteúdo da origem no destino    
             destChannel.transferFrom(oriChannel, 0, oriChannel.size());    
             ftp.transmite("d:\temp\"+nf.getPath()+".xml");    
             // Fecha channels    
             oriChannel.close();    
             destChannel.close();    
             dao.gravar(nf);    
  
             File del = new File("d:\temp\"+nf.getPath()+".xml");    
             del.deleteOnExit();
    } catch (IOException ioe) {
             ioe.printStackTrace();
             JOptionPane.showMessageDialog(null, "Deu zebra na posição "+ i + ", o erro é " + ioe.getMessage();    
    } catch (Exception e) {    
             e.printStackTrace();  
             JOptionPane.showMessageDialog(null, e.getMessage());    
    } finally {  
             continue;  
    }
 }

Não se esqueça de que o bloco finally continua mesmo assim garantindo a execução do código mesmo que tenha mais de uma exceção tratada e ao contrário dos blocos “catch” voce só pode ter um bloco “finally” por cada par de bloco try

Existem também outras exceções que voce pode tratar no código acima, que são “NullPointerException” e o “FileNotFoundException”.

Todas estas classes de exceção herdam (Extends) de Exception

Bom, na verdade você não precisa daquele finally ali, pois em seguida do try ele já volta para o laço for. Aliás, não precisa de dois try seguidos. O que deve estar acontecendo no seu caso é aquele trecho fora do try {} catch() {} que deve estar causando algum problema. Coloque ele pra dentro do bloco try.

listArquivos[i] = listArq.getModel().getElementAt(i).toString();

Para você saber quais índices deram problema, você captura as Exceptions e trata-as adequadamente, e aproveita e adiciona o índice em uma lista. Fiz um exemplo aqui, ele tem o laço for e dentro o try/catch, e depois mostra quais deram errado depois.

[code]import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class TesteForException {
public static void main(String[] args) {
List problemas = new ArrayList();
Random random = new Random();
for (int i = 0; i < 20; i++) {
try {
if (random.nextBoolean()) {
throw new Exception("Erro na posição " + i);
}
System.out.println("OK na posição " + i);
} catch (Exception e) {
System.out.println(e);
problemas.add(i);
}
}
System.out.println("Problemas ocorreram com os seguintes itens: " + problemas.toString());
}

}
[/code]

A saída que tive foi assim:

OK na posição 0 OK na posição 1 java.lang.Exception: Erro na posição 2 java.lang.Exception: Erro na posição 3 OK na posição 4 java.lang.Exception: Erro na posição 5 OK na posição 6 OK na posição 7 OK na posição 8 OK na posição 9 java.lang.Exception: Erro na posição 10 java.lang.Exception: Erro na posição 11 OK na posição 12 OK na posição 13 java.lang.Exception: Erro na posição 14 java.lang.Exception: Erro na posição 15 OK na posição 16 java.lang.Exception: Erro na posição 17 OK na posição 18 OK na posição 19 Problemas ocorreram com os seguintes itens: [2, 3, 5, 10, 11, 14, 15, 17]

abraços e boa sorte