开发者

Null pointer exception

I have this code in two classes

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                   

}

Can't find out why I get NullPointerException. I would like also to call in main methods buildDataArray, printDataArray(), buildDateArray and printDateArray().

Txt data to import is as follow

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

Thanks!


You're calling numberOfLines when you initialize instance variables.

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

And numberOfLines uses fileToImport, which you set in the constructor.

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

But those variables are initialized before constructor is executed, so fileToImport is actually null.
A possible solution: move initialization in the constructor, right after assignment.

PS There's the 'edit' button right below your post: you can use it to add stacktrace or any other information to it. Much easier than posting a dozen of comments.


When you get an exception in Java, a stack trace is generated. The first line of the stack trace is the message of the exception, and the second line, wiich starts with at, shows you exactly where in the code this exception has been thrown (class, method an line number in the source file).

Look at this location, and try to find why the exception occurs. A NullPointerException, in 99% of the cases, means that you're trying to call a method or access a field on a null reference (i.e. a variable which has never been initialized).

So, try to find it yourself, or give us the stack trace and tell you to what line in the code the line number points to, so that we can help you more.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜