2017-10-14 5 views
0

Je tente de lire un fichier CSV puis de créer un nouvel objet basé sur ce fichier CSV. Je peux le faire avec la bibliothèque SuperCSV, mais si une erreur se produit (comme une cellule spécifique est nulle), une erreur est générée (comme prévu). J'essaye de rassembler toutes les erreurs dans un ArrayList, mais maintenant à la première exception tout s'arrêtera. Comment obtenir le SuperCSV CsvBeanReader pour continuer à la ligne suivante, même s'il y a une erreur avec le processeur? J'ai la condition de boucle dans le bloc try/catch. Code ci-dessous:Java SuperCSV CsvBeanReader continuer malgré l'erreur

ArrayList<Duplicate> duplicates = new ArrayList<Duplicate>(); 
ArrayList<BadProperty> invalidProperties = new ArrayList<BadProperty>(); 

File convFile = new File(file.getOriginalFilename()); 
convFile.createNewFile(); 
FileOutputStream fos = new FileOutputStream(convFile); 
fos.write(file.getBytes()); 
fos.close(); 

ICsvBeanReader beanReader = null; 
try { 
    beanReader = new CsvBeanReader(new FileReader(convFile), CsvPreference.STANDARD_PREFERENCE); 

    final String[] header = beanReader.getHeader(true); 
    final CellProcessor[] processors = getProcessors(); 

    Property property; 
    while ((property = beanReader.read(Property.class, header, processors)) != null) { 
      // logic in here 


     } 
    } 
    catch(SuperCsvException e) { 
     invalidProperties.add(new BadProperty(e.getCsvContext())); 
     System.out.println(e); 

    } 
    finally { 
     if(beanReader != null) { 
      beanReader.close(); 
     } 
    } 

Répondre

1

La chose la plus importante est de déplacer la prise d'essai dans la boucle, de sorte que la boucle ne s'arrête pas lorsqu'une exception se produit. Voici comment je le ferais

private void readProperties() 
{ 
    try 
    { 
    beanReader = new CsvBeanReader(new FileReader(convFile), CsvPreference.STANDARD_PREFERENCE); 

    while (readNextProperty()) 
    { 
    } 
    } 
    catch (Exception e) 
    { 
    } 
    finally 
    { 
    if(beanReader != null) 
    { 
     beanReader.close(); 
    } 
    } 
} 

/** Returns true when there are more properties to read. */ 
private boolean readNextProperty() 
{ 
    try 
    { 
    Property property = beanReader.read(Property.class, header, processors); 
    if (property == null) 
    { 
     return false; 
    } 

    // logic in here 

    } 
    catch (SuperCsvException e) 
    { 
    invalidProperties.add(new BadProperty(e.getCsvContext())); 
    System.out.println(e); 
    } 

    return true; 
}