2011-03-04 129 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意味着您試圖調用方法或訪問空引用(即從未初始化的變量)的字段。

因此,請嘗試自己找到它,或給我們堆棧跟蹤,並告訴您代碼行號指向哪行,以便我們可以幫助您更多。