2011-03-04 168 views
0

我有两个班空指针异常

这个代码
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。我还想用主要方法buildDataArray,printDataArray(),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 

谢谢!

+5

你在哪一行得到它? – 2011-03-04 08:09:13

+0

运行: 异常在线程 “AWT-EventQueue的-0” 显示java.lang.NullPointerException 在myProva.FileImport.checkIsFile(FileImport.java:22) 在myProva.FileImport.numberOfLines(FileImport.java:27) 在myProva .FileImport。 (FileImport.java:83) – 2011-03-04 08:11:28

+1

请添加遵循NullPointerException的堆栈跟踪。 – ordnungswidrig 2011-03-04 08:12:22

回答

4

当初始化实例变量时,您打电话给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实际上是空。
一个可能的解决方案:在赋值之后立即在构造函数中移动初始化。

PS您的文章下方有'编辑'按钮:您可以使用它来添加堆栈跟踪或任何其他信息。比发表十多条评论容易得多。

+0

良好的捕捉。这是尊重约定的另一个理由:成员变量应该在类的开始,在构造函数之前。这样,它更符合用于初始化对象的顺序,并且更容易检测到这种问题。 – 2011-03-04 08:25:15

+0

谢谢Nikita,你的建议很有帮助 – 2011-03-04 08:43:27

1

当您在Java中遇到异常时,会生成堆栈跟踪。堆栈跟踪的第一行是异常消息,第二行(以at开头)显示了代码中抛出异常的位置(类,方法是源文件中的行号)。

看看这个位置,并尝试找出发生异常的原因。在99%的情况下,NullPointerException意味着您试图调用方法或访问空引用(即从未初始化的变量)的字段。

因此,请尝试自己找到它,或给我们堆栈跟踪,并告诉您代码行号指向哪行,以便我们可以帮助您更多。