我认为这里的问题是一个愚蠢的语法问题,但事实确实如此。我正在编写一个程序,该程序采用CSV文件,它是3行4列数字。我在运行时将该文件作为参数,然后在换行符(\ n)处拆分,然后在逗号分隔符处拆分。然后,将其存储到String类型的“ 2D数组”中。然后,我取每个值,解析为两倍,然后填充第二个“ 2D数组”,但这次为两倍。一切都很好。
我的问题是当我尝试采用所有这些代码并将其放入自己的类中时。我在主体中添加了一个构造函数,并在该类中复制并粘贴了以前的工作代码。但是现在,当从字符串解析为双精度时,从第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)
最佳答案
构造函数中的局部变量dMatrix
隐藏属性dMatrix
只需通过double[][] dMatrix = new double[sMatrix.length][];
在构造函数代码中更改dMatrix = new double[sMatrix.length][];
。