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 "/
}
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
[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.
[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.
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.
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]