我在两节课中有这段代码

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

}


找不到为什么我得到NullPointerException的原因。我还想调用主要方法buildDataArrayprintDataArray()buildDateArrayprintDateArray()

导入的TXT数据如下

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


谢谢!

最佳答案

初始化实例变量时,您正在调用numberOfLines

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


并且numberOfLines使用在构造函数中设置的fileToImport

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


但是这些变量在构造函数执行之前已初始化,因此fileToImport实际上为null。
一种可能的解决方案:在分配后立即在构造函数中移动初始化。

PS:您的帖子下方有一个“编辑”按钮:您可以使用它向其添加stacktrace或任何其他信息。比发布十几条评论要容易得多。

09-11 17:18