如何从java中的try-catch块返回一个数组?

时间:2013-11-07 01:26:07

标签: java arrays try-catch

我通过读取文件创建了一个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;

 }

2 个答案:

答案 0 :(得分:1)

原始代码在数组中只分配一个值,即元素data[0][0],因为xy永远不会从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]);
}

这两个版本都没有经过测试,但它们都应该接近工作解决方案。

第二种方法更通用,应该是首选,但为了避免doubleDouble之间的装箱/拆箱,它假设,如果任何读取为字符串的元素不是有效的{ {1}},double数组中的相应位置将由下一个有效elements填充,如果有的话。因此,例如,如果一行中有10个元素,并且只有8个元素总共有效,那么数组的前8个位置将包含这些元素的值,最后2个位置将包含{{1} (在double数组初始化期间设置)。

答案 1 :(得分:0)

没有特别需要将变量声明为最终变量。 您也不需要将其声明为私有。

简单

double[][]data = new double[178][13];

变量声明不正确