我通过读取文件创建了一个2D数组,我想返回这个数组。但是我因为读取文件而使用try-catch块。此时我无法从此函数返回此数组。此外,当我尝试在try-catch块中编写此数组的元素时,它可以正常工作但不会阻止它。我该怎么做才能获得阵列?
我的代码如下:
public static double[][] readFile(String fileName) {
final double[][]data = new double[178][13];
int x=0, y=0;
try{
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
while((line = reader.readLine())!= null){
String[]values=line.split(",");
for(String str:values){
double str_double=Double.parseDouble(str);
data[x][y]=str_double;
System.out.print(data[x][y]+" ");
}
System.out.println();
}
reader.close();
}
catch(Exception e){}
return data;
}
最后,在每个人的帮助下,我找到了解决方案。我的一个错误是定义y。因为每行有14个元素,但是我将其分配给13.还改变了数组的赋值方法。也许有人需要,所以我把它发布到我的解决方案:
public static double[][] readFile(String fileName) {
double[][]data=new double[178][14];
int x=0, y;
try{
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
String[]values;
while((line = reader.readLine())!= null){
values=line.split(",");
for(y=0; y<values.length; y++){
data[x][y]=Double.parseDouble(values[y]);
}
x++;
}
reader.close();
}
catch(Exception e){System.out.println("Aborting due to error: " + e);}
return data;
}
答案 0 :(得分:1)
原始代码在数组中只分配一个值,即元素data[0][0]
,因为x
和y
永远不会从0更改。
假设x
是行,而y
是列(行中的元素),则以下内容应该有效:
public static double[][] readFile(String fileName) {
final double[][]data = new double[178][13];
int x, y;
try{
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
x = 0; // Reset the line counter
while((line = reader.readLine()) != null) { // Read a new line
y=0; // Reset the column counter, since this is a new line
String[]values=line.split(",");
for(String str:values){
double str_double=Double.parseDouble(str);
data[x][y]=str_double;
System.out.print(data[x][y]+" ");
++y; // Advance to the next column
}
++x; // Advance to the next line
System.out.println();
}
reader.close();
} catch (Exception e) {
System.out.println("Aborting due to error: " + e);
}
return data;
}
当然,上述假设调用readLine()
或parseDouble()
时不会发生错误。如果发生任何此类错误,或发生ArrayIndexOutOfBoundsException
,则返回的数组将仅包含到目前为止读取的元素。
这是一个改进版本,同样保留尽可能多的原始代码:
public static double[][] readFile(String fileName) {
ArrayList<double[]> numbers = new ArrayList<double[]>();
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line;
while ((line = reader.readLine()) != null) { // Read a new line
int y=0; // Reset the column counter, since this is a new line
String[] values = line.split(",");
if (values.length > 0) {
double[] elements = new double[values.length];
for (String str:values) {
double str_double;
try {
str_double = Double.parseDouble(str);
elements[y] = str_double;
System.out.print(elements[y] + " ");
++y; // Advance to the next column
} catch (Exception e) {
continue; // Not a double, ignore
}
}
numbers.add(elements);
} else {
numbers.add(new double[0]); // No numbers read from the line
}
System.out.println();
}
reader.close();
} catch (Exception e) {
System.out.println("Aborting due to error: " + e);
}
return numbers.toArray(new double[0][0]);
}
这两个版本都没有经过测试,但它们都应该接近工作解决方案。
第二种方法更通用,应该是首选,但为了避免double
和Double
之间的装箱/拆箱,它假设,如果任何读取为字符串的元素不是有效的{ {1}},double
数组中的相应位置将由下一个有效elements
填充,如果有的话。因此,例如,如果一行中有10个元素,并且只有8个元素总共有效,那么数组的前8个位置将包含这些元素的值,最后2个位置将包含{{1} (在double
数组初始化期间设置)。
答案 1 :(得分:0)
没有特别需要将变量声明为最终变量。 您也不需要将其声明为私有。
简单
double[][]data = new double[178][13];
变量声明不正确