2017-02-09 27 views
1

我認爲我的問題在這裏是一個愚蠢的,語法問題,但它在這裏。我正在編寫一個程序,它使用CSV文件,它是3行,每行4列數字。我在運行時將該文件作爲參數,然後分割爲換行符(\ n),然後在逗號分隔符處進行拆分。然後我將它存儲到String類型的「2D數組」中。然後,我取每個值,解析爲雙倍,並填充第二個「2D陣列」,但這次是雙倍。一切都很好。一個類中的數字格式例外

我的問題是,當我試圖把所有的代碼,並把它放入它自己的類。我向main添加了一個構造函數,並在類中複製並粘貼了以前的代碼。但是現在,當從字符串解析爲double時,從第4個元素到第5個元素時,我得到NumberFormatException。完全相同的代碼在主代碼中編碼時工作。

我認爲我的課程知識是我的問題。

這裏是我製作類:

import java.lang.*; 

public class DataMatrix { 

    private double[][] dMatrix; 

    public DataMatrix(String text) { 

     String[] line = text.split("\n"); 
     // Creates an array for the CSV file 
     String[][] sMatrix = new String[line.length][]; 

     for(int i=0; i < line.length; i++) 
      sMatrix[i] = text.split(","); 
     System.out.println("Original String: "); 

     for(int x=0; x < sMatrix.length; x++) { 
      for(int j=0; j <= line.length; j++) { 
       System.out.println(sMatrix[x][j]); 
      } 
     } 

     double[][] dMatrix = new double[sMatrix.length][]; 
     System.out.println("Converted to double: "); 

     for(int x=0; x < sMatrix.length; x++) { 
      dMatrix[x] = new double[sMatrix[x].length]; 
      for(int j=0; j <= sMatrix.length; j++) { 

       dMatrix[x][j] = Double.parseDouble(sMatrix[x][j]); 
       System.out.println(dMatrix[x][j]); 
      } 
     } 
    } 
} 

這裏是我的主(忽略的意見,使用他們當我複製/粘貼的東西出來吧):

import java.lang.*; 

public class Assignment1{ 
    public static void main(String[] args){ 

// DecimalFormat df = new DecimalFormat("#.##"); 

     //Make sure the user passed the command line argument - and nothing else 
     if (args.length != 1){ 
      System.out.println("Assignment1 takes exactly one command-line argument."); 
      System.out.println("Usage: java Assignment1 some_file.csv"); 
      System.exit(0); 
     } 

     String csvFileName = args[0]; 

     //Instantiate my custom file reader 
    CSVReader fileReader = new CSVReader(); 

     //Read the file into a string 
     String text = fileReader.readFile(csvFileName); 
    DataMatrix matrix = new DataMatrix(text); 

}//end of main 
}//end of class 

編輯:這裏我的輸出:

Files contents: 
1,2,3,4 
3,4,1,0 
2,3,4,2 

Original String: 
1 
2 
3 
4 
3 
4 
1 
0 
2 
3 
4 
2 

Converted to double: 
1.0 
2.0 
3.0 
Exception in thread "main" java.lang.NumberFormatException: For input string: "4 3" 

at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1250) 
at java.lang.Double.parseDouble(Double.java:540) 
at DataMatrix.<init>(DataMatrix.java:30) 
at Assignment1.main(Assignment1.java:22) 
+0

提供失敗的csv輸入行。爲了更容易地重現錯誤,臨時添加調試輸出 String doubleString = sMatrix [x] [j]; 嘗試Double.parseDouble(doubleString); (NumberFormatException e){System.out.println(「NFE on:」+ doubleString); } – JanPl

+0

是不是這行'sMatrix [i] = text.split(「,」);'應該是'sMatrix [i] = line [i] .split(「,」);'? –

+0

編輯我的帖子以顯示輸出錯誤。 –

回答

0

構造函數中的局部變量dMatrix隱藏屬性dMatrix

只需在構造函數代碼中將double[][] dMatrix = new double[sMatrix.length][];更改爲dMatrix = new double[sMatrix.length][];

+0

感謝您的回覆。當這樣做時,我現在得到一個NullPointException錯誤。 –

+0

不要刪除整行。您剛剛在全球範圍內聲明瞭「2-D數組」。你仍然需要提供它的參考,所以用'dMatrix = new double [sMatrix.length] [];'@NickM –

+0

@SanketMakani更改該行當我這樣做時,我得到了相同的sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal )錯誤。 DataMatrix.java中的第30行和Assignment1.java中的第22行 –

0

恐怕有太多東西在當前版本的程序中不太正確。我會盡量簡化它。您可以將其與您的產品進行比較並瞭解錯誤信息:

import java.lang.*; 

public class DataMatrix { 

    public DataMatrix(String text) { 
     //Replace the new line character (\n or \\r or \r\n) with a comma and split based on comma. 
     String[] numbers = text.replaceAll("\r?\n|\r", ",").split(","); 
     for(int i=0; i<numbers.length; i++) 
      System.out.println(Double.parseDouble(numbers[i])); 

    } 
}