Erreur Java : Je n'arrive pas à retirer mon erreur

Résolu/Fermé
caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022 - Modifié le 28 juin 2022 à 17:10
 Caramelwilly - 8 juil. 2022 à 09:33
Bonjour,
J'ai réalisé un programme afin de convertir un fichier csv en xml mais j'ai une erreur "NullPointerException".
A première vue, je connais cette erreur, j'ai une variable vide que j'utilise et cela crée l'erreur (grossièrement).
Cependant, je ne comprends pas pourquoi j'ai cette erreur dans mon programme, je pense pourtant initaliser ma variable .
J'ai tenté différemment de lui donner une valeur mais rien ne fonctionne.
Pensez-vous pouvoir m'aider?
J'ai du sûrement louper quelque chose...
Merci à vous !
PS : j'ai réalisé 2 classes que je vous mets ci-dessous

package image;

import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Window.Type;

import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;

import com.opencsv.exceptions.CsvException;

//import image.conversion.XMLCreators;

import java.awt.Button;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.awt.event.ActionEvent;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class fenetre extends conversion {
 //char t = ',';
 private JFrame frmFaiaPourFidexpert;
 
 public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable(){
   public void run(){
    try {
     fenetre window = new fenetre();
     window.frmFaiaPourFidexpert.setVisible(true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
 }

 public fenetre(){
  initialize();
 }

 /**
* Initialize the contents of the frame.
*/
 private void initialize(){
  frmFaiaPourFidexpert = new JFrame();
  frmFaiaPourFidexpert.setBackground(new Color(245, 222, 179));
  frmFaiaPourFidexpert.setTitle("FAIA pour FID-Expert");
  frmFaiaPourFidexpert.setForeground(Color.BLACK);
  frmFaiaPourFidexpert.setIconImage(Toolkit.getDefaultToolkit().getImage(fenetre.class.getResource("/image/lux.png")));
  frmFaiaPourFidexpert.setBounds(100, 100, 470, 440);
  frmFaiaPourFidexpert.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frmFaiaPourFidexpert.setResizable(false);
  
  JButton btnNewButton = new JButton("Convertir un fichier");
  btnNewButton.setBounds(0, 302, 456, 29);
  btnNewButton.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    String s = e.getActionCommand();
       
       if (s.equals("Convertir un fichier")) {
        JFileChooser fichier = new JFileChooser( FileSystemView.getFileSystemView().getHomeDirectory());
        fichier.setDialogTitle("Choississez votre fichier .csv");
        fichier.setAcceptAllFileFilterUsed(false);
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Fichier .csv","csv");
        fichier.addChoosableFileFilter(filter);
        int res = fichier.showOpenDialog(null);
           // Enregistrez le fichier
           if (res == JFileChooser.APPROVE_OPTION) {
             String XML;
             XML = null;
             
             //File file = fichier.getSelectedFile();
             String fi = fichier.getName();
             XMLCreators xmlCreators = new XMLCreators();
       xmlCreators.convertFile(fi, XML, '\t');
             //conversion.XMLCreators.convertFile(String,String,char);
            
             
             
          }
        ;
         
       }
   }
  });
  frmFaiaPourFidexpert.getContentPane().setLayout(null);
  btnNewButton.setForeground(Color.BLACK);
  btnNewButton.setFont(new Font("Yu Gothic UI", Font.BOLD, 14));
  btnNewButton.setBackground(new Color(168, 146, 28));
  frmFaiaPourFidexpert.getContentPane().add(btnNewButton);
  
  JLabel lblNewLabel = new JLabel("");
  lblNewLabel.setBounds(0, 14, 456, 328);
  lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
  lblNewLabel.setIcon(new ImageIcon(fenetre.class.getResource("/image/fid.png")));
  frmFaiaPourFidexpert.getContentPane().add(lblNewLabel);
  
  JLabel lblNewLabel_1 = new JLabel("                Conversion fichier pour FAIA");
  lblNewLabel_1.setBounds(0, 0, 456, 24);
  lblNewLabel_1.setBackground(new Color(218, 165, 32));
  lblNewLabel_1.setFont(new Font("Microsoft New Tai Lue", Font.BOLD, 18));
  frmFaiaPourFidexpert.getContentPane().add(lblNewLabel_1);
  
  JMenuBar menuBar = new JMenuBar();
  frmFaiaPourFidexpert.setJMenuBar(menuBar);
  
  JMenu mnNewMenu = new JMenu("Aide");
  JMenuItem menuItem = new JMenuItem("?");
  menuItem.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    String w = e.getActionCommand();
    JFrame frame = new JFrame();
    if (w.equals("?")) {
     JDialog d = new JDialog(frame, "Aide");
     JLabel l = new JLabel("Le bouton convertit un fichier .csv en .xml directement sur votre PC");
     d.getContentPane().add(l);
     d.setIconImage(Toolkit.getDefaultToolkit().getImage(fenetre.class.getResource("/image/lux.png")));
     d.setSize(400,100);
     d.setVisible(true);
    }
   }
  });
  mnNewMenu.add(menuItem);
  menuBar.add(mnNewMenu);
 }

}

package image;
import com.opencsv.CSVParser;
import com.opencsv.CSVParserBuilder;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class conversion {
    public static void main(String[] args) {
        new conversion();
    }

   // public conversion(){
    //    new XMLCreators().convertFile("Test.csv", "Test.xml", '\t');
    //}

    public class XMLCreators {
        // Protected Properties

        protected DocumentBuilderFactory domFactory = null;
        protected DocumentBuilder domBuilder = null;

        public XMLCreators(){
            try {
                domFactory = DocumentBuilderFactory.newInstance();
                domBuilder = domFactory.newDocumentBuilder();
            } catch (FactoryConfigurationError exp) {
                System.err.println(exp.toString());
            } catch (ParserConfigurationException exp) {
                System.err.println(exp.toString());
            } catch (Exception exp) {
                System.err.println(exp.toString());
            }
        }

        public int convertFile(String csvFileName, String xmlFileName, char delimiter) {

            int rowsCount = -1;
            BufferedReader csvReader;
            try {
                Document newDoc = domBuilder.newDocument();
                // Root element
                Element rootElement = newDoc.createElement("XMLCreators");
                newDoc.appendChild(rootElement);
                // Read csv file
                csvReader = new BufferedReader(new FileReader(csvFileName));

                //** Now using the OpenCSV **//
                CSVParser parser = new CSVParserBuilder()
                        .withSeparator(delimiter)
                        .build();

                CSVReader reader = new CSVReaderBuilder(new FileReader(csvFileName))
                        .withCSVParser(parser)
                        .build();
                //CSVReader reader = new CSVReader(csvReader);
                String[] nextLine;
                int line = 0;
                List<String> headers = new ArrayList<String>(5);
                while ((nextLine = reader.readNext()) != null) {
                    if (line == 0) { // Header row
                        for (String col : nextLine) {
                            headers.add(col);
                        }
                    } else { // Data row
                        Element rowElement = newDoc.createElement("row");
                        rootElement.appendChild(rowElement);

                        int col = 0;
                        for (String value : nextLine) {
                            String header = headers.get(col).replaceAll("[\\t\\p{Zs}\\u0020]", "_");

                            Element curElement = newDoc.createElement(header);
                            curElement.appendChild(newDoc.createTextNode(value.trim()));
                            rowElement.appendChild(curElement);

                            col++;
                        }
                    }
                    line++;
                }
                //** End of CSV parsing**//

                FileWriter writer = null;

                try {

                    writer = new FileWriter(new File(xmlFileName));

                    TransformerFactory tranFactory = TransformerFactory.newInstance();
                    Transformer aTransformer = tranFactory.newTransformer();
                    aTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
                    aTransformer.setOutputProperty(OutputKeys.METHOD, "xml");
                    aTransformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

                    Source src = new DOMSource(newDoc);
                    Result result = new StreamResult(writer);
                    aTransformer.transform(src, result);

                    writer.flush();

                } catch (Exception exp) {
                    exp.printStackTrace();
                } finally {
                    try {
                        writer.close();
                    } catch (Exception e) {
                    }
                }

                // Output to console for testing
                // Resultt result = new StreamResult(System.out);
            } catch (IOException exp) {
                exp.printStackTrace();
            } catch (Exception exp) {
                exp.printStackTrace();
            }
            return rowsCount;
            // "XLM Document has been created" + rowsCount;
        }
    }
}
A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
28 juin 2022 à 17:12
Bonjour,

Pourrais tu poster également la stack trace de l'exception, elle indique exactement sur quelle ligne est l'erreur, donc ça aide à savoir quel code pose problème.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022
29 juin 2022 à 20:13
getName() ne renvoie que le nom du fichier (GL 2017.csv dans l'erreur), donc par défaut Java va le chercher dans son répertoire de travail, où de toute évidence le fichier n'est pas.

Il faudrait plutôt utiliser getSelectedFile() pour récupérer le chemin d'accès complet du fichier (C:/.../GL 2017.csv)
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022
30 juin 2022 à 22:01
Ici on ne sait pas trop ce que tu manipules comme données, le mieux serait d'intercepter l'exception pour l'enrichir de la donnée manipulée lors de l'erreur.

Exemple :
String header = headers.get(col).replaceAll("[\\t\\p{Zs}\\u0020]", "_");
Element curElement;
try {
    curElement = newDoc.createElement(header);
} catch (Exception e) {
    throw new RuntimeException("Can't createElement [" + header + "] for col=" + col, e);
}

À mon avis ton replaceAll est à revoir, j'ai du mal à comprendre ce que tu essaies de faire avec ta regex, elle est probablement incorrecte d'où ton erreur.
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022
1 juil. 2022 à 11:36
Peut-être qu'il faudrait tout reprendre de zéro plutôt que de copier-coller ici ou là des codes que tu ne comprends pas, alors qu'au final la conversion d'un fichier CSV en XML peut-être relativement simple. Exemple :

CsvToXml.java
import java.io.*;
import java.util.Scanner;

public class CsvToXml {
    public static void convert(File csvFile, File xmlFile) {
        try (Scanner sc = new Scanner(csvFile); PrintWriter pw = new PrintWriter(xmlFile)) {
            String[] headers = sc.nextLine().split(";");
            pw.println("<lines>");
            while (sc.hasNextLine()) {
                String[] values = sc.nextLine().split(";");
                pw.println("  <line>");
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("    <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("  </line>");
            }
            pw.println("</lines>");
        } catch (IOException e) {
            throw new UncheckedIOException("Can't convert " + csvFile + " to " + xmlFile, e);
        }
    }
}

App.java
public class App {
    public static void main(String[] args) {
        CsvToXml.convert(new File("C:/test.csv"), new File("C:/test.xml"));
    }
}

C:/test.csv
FirstName;LastName
Luke;Skywalker
Obi-Wan;Kenobi

C:/test.xml
<lines>
  <line>
    <FirstName>Luke</FirstName>
    <LastName>Skywalker</LastName>
  </line>
  <line>
    <FirstName>Obi-Wan</FirstName>
    <LastName>Kenobi</LastName>
  </line>
</lines>
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > Caramelwilly
1 juil. 2022 à 13:49
Faut-il avoir le fichier xml déjà créé?
Non, c'est le programme qui le créé.

je n'ai rien qui s'affiche en retour
Mon code n'affiche rien, c'est normal, par contre tu dois avoir un fichier créé, là où tu lui a demandé de s'écrire.
Éventuellement tu peux rajouter des lignes d'affichages dans la console :
System.out.println("Read CSV file : " + csvFile.getAbsolutePath());
...
System.out.println("Write XML file : " + xmlFile.getAbsolutePath());
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > caramelwilly Messages postés 14 Date d'inscription mardi 28 juin 2022 Statut Membre Dernière intervention 18 juillet 2022
4 juil. 2022 à 20:41
Bonjour,

Tu peux faire quelque chose comme ça :

File dir = new File("C:/Users/33781/Desktop/stage/fichier_d");
File output = new File(dir, "output.xml");
for (int i=1; output.exists(); i++) {
     output = new File(dir, "output_" + i + ".xml");
}
conversion.convert(file, output);
1

Bonjour.

Je me permets de revenir vers vous car j'aimerais complexifier un peu mon programme.

Est-il possible de faire différentes "sections" sur mon fichier XML et de rediriger mes fichiers csv vers chaque section.

Du type je dois sélectionner 3 fichiers en entrée :

-fichier1

-fichier2

-fichier3

Et mon XML doit se former comme suit :

<General>

       <section 1>

        fichier1 converti

        </Section1>

        <section2>

        fichier2 converti

        </section2>

        <section3>

        fichier3 converti

        </section3>

</general>

Je sais déjà que pour pouvoir choisir plusieurs fichiers j'utilise la fonction "fichier.setMultiSelectionEnabled(true);"

Maintenant je cherche à rediriger les fichiers dans mon programme conversion, et de créer un XML avec 3 sections.

Je pensais faire un "if nom_du_fichier == fichier1 ==> fichier 1 est converti dans la section1"

Mais je suis un peu perdu quant à rediriger le fichier vers une section que j'aurais créé.

De plus, j'ai modifié du coup la class conversion comme suit :

package image;
import java.io.*;
import java.util.Scanner;

public class conversion {
	static int i=0;
    public static void convert(File csvFile, File xmlFile) {
        try (Scanner sc = new Scanner(csvFile); PrintWriter pw = new PrintWriter(xmlFile)) {
            String[] headers = sc.nextLine().split(";");
            pw.println("<AuditFile>");
            while (sc.hasNextLine()) {
                String[] values = sc.nextLine().split(";");
                pw.println("  <Header>");
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("    <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("  </Header>");
                
            }
            while (sc.hasNextLine()) {
                String[] values = sc.nextLine().split(";");
                pw.println("  <section2>");
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("    <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("  </section2>");
                
            }
            while (sc.hasNextLine()) {
                String[] values = sc.nextLine().split(";");
                pw.println("  <section3>");
                for (int i = 0; i < values.length && i < headers.length; i++) {
                    pw.println("    <" + headers[i] + ">" + values[i] + "</" + headers[i] + ">");
                }
                pw.println("  </section3>");
                
            }
            pw.println("</AuditFile>");
            
        } catch (IOException e) {
            throw new UncheckedIOException("Can't convert " + csvFile + " to " + xmlFile, e);
        }
    }
}

Merci de votre aide!

0