2011-03-04 7 views
0

Je possède ce code dans deux classesexception de pointeur nul

package myProva; 

import java.io.*; 
import java.util.StringTokenizer; 
import java.util.*; 
import java.text.SimpleDateFormat; 

public class FileImport { 

    private File fileToImport; 

    public FileImport(File myFile) { 
     fileToImport = myFile; 
    }//constructor for fileToImport field 

    int lines = 0; 
    String[][]bin; 

    public boolean checkIsFile(){ 
     return fileToImport.isFile(); 
    } 

    public int numberOfLines(){ 
     lines = 0; 
     if(checkIsFile()){ 
      try{ 
       FileReader fr = new FileReader(fileToImport); 
       BufferedReader br = new BufferedReader(fr); 
       while((br.readLine()!=null)){ 
        lines++; 
       }//end while loop 
       br.close(); 
     }catch(Exception e){ 
       System.out.println(e); 
      } 
     } 
      else{ 
       System.out.println("There is no file to import"); 
       } 
     return lines; 
     }//returns number of lines in a txt file 

    public void importToArray(){ 
     int rows = 0; 
     bin = new String[numberOfLines()][6]; 
     try { 
      FileReader fr = new FileReader(fileToImport); 
      BufferedReader br = new BufferedReader(fr); 
      String line = null; 

      while((line = br.readLine())!= null){ 
       StringTokenizer stk = new StringTokenizer(line, ","); 
       while(stk.hasMoreTokens()){ 
        for (int cls = 0;cls<6; cls++){ 
         bin[rows][cls]= stk.nextToken(); 
        } 
        rows++; 
       }//end inner while loop 
      }//end outer while loop 
      br.close(); 
     }//end try 
     catch(Exception e){ 
      System.out.println(e); 
     } 
    }//import data to bin array 

    public void printArray(){ 
     for(int i =0;i<bin.length; i++){ 
      System.out.printf("%s ", i); 
      for(int j =0;j<bin[i].length; j++){ 
       System.out.printf("%s ", bin[i][j]); 
      } 
      System.out.println(""); 
     }//end for loop 
    }//print contents of bin array 

    public String[][] getArray(){ 
     return bin; 
    }//return bin array 

    double[][]dataArray = new double [numberOfLines()][5];//Array for double data 
    Date[]dateArray = new Date[numberOfLines()];//Array for date(calendar) 

    public void buildDateArray(String[][]d) { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");//set date format here 
     for(int i=0;i<d.length; i++){ 
      for(int j = 0;j<d[i].length; j++){ 
       if(j==0){ 
        try{ 
         Date newDate = (Date)sdf.parse(d[i][0]);//parse first column to Date 
         dateArray[i] = newDate; 
        }//end try 
       catch(Exception e){ 
         System.out.println(e); 
        }//end catch 
      } 
     } 
    }//end for loops 
    } 

    public void buildDataArray(String[][]d){ 
     for(int i=0;i<d.length;i++){ 
      for(int j=0;j<d[i].length; j++){ 
       switch(j){ 
        case 0: 
         dataArray[i][j]=0; 
         break; 
        case 1: 
         dataArray[i][j]=new Double(d[i][j]); 
         break; 
        case 2: 
         dataArray[i][j]=new Double(d[i][j]); 
         break; 
        case 3: 
         dataArray[i][j]=new Double(d[i][j]); 
         break; 
        case 4: 
         dataArray[i][j]=new Double(d[i][j]); 
         break; 
        case 5: 
         dataArray[i][j]=new Double(d[i][j]); 
         break; 
       }//end switch 
      } 
     }//end for loops 
    } 

    public void printDataArray(){ 
     for(int i=0;i<dataArray.length;i++){ 
      for(int j=0;j<dataArray[i].length;j++){ 
       System.out.printf("%s ", dataArray[i][j]); 
      } 
      System.out.println(""); 
     } 
    } 

    public void printDateArray(){ 
     for(int i=0;i<dateArray.length;i++){ 
      System.out.println(dateArray[i]); 
     } 
    } 
} 

package myProva; 

import java.io.File; 
import javax.swing.JFileChooser; 
import javax.swing.filechooser.FileFilter; 
import java.io.*; 

public class ProvaJFrame extends javax.swing.JFrame { 

    /** Creates new form ProvaJFrame */ 
    public ProvaJFrame() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     LoadDataButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     LoadDataButton1.setText("Load Data"); 
     LoadDataButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       LoadDataButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(53, 53, 53) 
       .addComponent(LoadDataButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(450, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(118, 118, 118) 
       .addComponent(LoadDataButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(233, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void LoadDataButton1ActionPerformed(java.awt.event.ActionEvent evt) {             
JFileChooser fileChooser = new JFileChooser(); 
    fileChooser.setFileFilter(new TxtFileFilter()); 
    int returnVal = fileChooser.showOpenDialog(this); 
    if(returnVal == JFileChooser.APPROVE_OPTION){ 
     File myFile = fileChooser.getSelectedFile(); 
     FileImport obj1 = new FileImport(myFile); 
     System.out.println(obj1.checkIsFile()); 
     System.out.println(obj1.numberOfLines()); 

     obj1.importToArray(); 
     obj1.printArray(); 

     System.out.println("--------------------------------------"); 
     } 
    } 

    private class TxtFileFilter extends FileFilter{ 
     public boolean accept(File file){ 
      if(file.isDirectory()) return true; 
      String fname = file.getName(); 
      return fname.endsWith("txt"); 
     } 
     public String getDescription(){ 
     return "txt file"; 
    } 
    }            

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new ProvaJFrame().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JButton LoadDataButton1; 
    // End of variables declaration     

} 

Vous ne trouvez pas pourquoi je me NullPointerException. Je voudrais également appeler dans les méthodes principales buildDataArray, printDataArray(), buildDateArray et printDateArray().

données Txt à importer est le suivant

20100415,6286.63,6310.76,6249.74,6291.45,31402600 
20100416,6264.65,6305.4,6162.84,6180.9,80519400 
20100419,6158.6,6190.86,6140.38,6162.44,38311800 
20100420,6193.5,6267.54,6172.57,6264.23,42345100 
20100421,6280.54,6281.38,6229.18,6230.38,46312400 

Merci!

+5

À quelle ligne l'obtenez-vous? –

+0

run: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException à myProva.FileImport.checkIsFile (FileImport.java:22) à myProva.FileImport.numberOfLines (FileImport.java:27) à myProva .FichierImport. (FileImport.java:83) –

+1

Veuillez ajouter la pile-pile qui suit l'exception NullPointerException. – ordnungswidrig

Répondre

4

Vous appelez numberOfLines lorsque vous initialisez des variables d'instance.

double[][]dataArray = new double [numberOfLines()][5];//Array for double data 
Date[]dateArray = new Date[numberOfLines()];//Array for date(calendar) 

Et numberOfLines utilise fileToImport, que vous définissez dans le constructeur.

public FileImport(File myFile) { 
    fileToImport = myFile; 
}//constructor for fileToImport field 

Mais ces variables sont initialisés avant constructeur est exécuté, alors fileToImport est en fait nulle.
Une solution possible: déplacer l'initialisation dans le constructeur, juste après l'affectation.

PS Il y a le bouton 'éditer' juste en dessous de votre message: vous pouvez l'utiliser pour ajouter une pile ou d'autres informations. C'est beaucoup plus facile que d'afficher une douzaine de commentaires.

+0

Bonne prise. C'est une raison supplémentaire de respecter les conventions: les variables membres doivent venir au début de la classe, avant le constructeur. De cette façon, il est plus en ligne avec l'ordre utilisé pour initialiser l'objet, et ce type de problème est plus facilement détecté. –

+0

Merci Nikita, votre suggestion est utile –

1

Lorsque vous obtenez une exception dans Java, une trace de pile est générée. La première ligne de la trace de la pile est le message de l'exception, et la deuxième ligne, qui commence par at, vous montre exactement où dans le code cette exception a été levée (class, méthode un numéro de ligne dans le fichier source).

Regardez cet emplacement et essayez de trouver pourquoi l'exception se produit. Une exception NullPointerException, dans 99% des cas, signifie que vous essayez d'appeler une méthode ou d'accéder à un champ sur une référence null (c'est-à-dire une variable qui n'a jamais été initialisée). Donc, essayez de le trouver vous-même, ou donnez-nous la trace de la pile et vous dire à quelle ligne du code le numéro de ligne pointe, afin que nous puissions vous aider davantage.