数组索引超出范围异常错误的Java列表

时间:2015-10-22 06:32:25

标签: java arrays exception arraylist protocol-buffers

我正在尝试将2d数组放入2d列表中。我正在建立谷歌protobuf。我无法弄清楚为什么我会抛出异常。我已经在堆栈上尝试了多个建议,但没有一个能够提供帮助。

这是我的客户端代码:

public class google_cl extends Thread {


 static Array createArray() throws IOException{

     Array.Builder array = Array.newBuilder();

    double[][]arrays = new double[15][15000];

        for(int i=1; i< 15; i++){
            for(int j=1; j<15000;j++){
            arrays[i][j]=Math.random()*100; 
            }
        }
        for(int i=1;i<15;i++){
            for(int j=1;j<15000;j++){
                  array = Array.newBuilder().setArrays(i, arrays[1][j]);    
            }

            }
        //System.out.println(array);

        // Make connection and initialize streams
        Socket socket;
        try {
            socket = new Socket("localhost", 9898);
             OutputStream outputStream = socket.getOutputStream();
                InputStream inputStream = socket.getInputStream();


                ObjectOutputStream os = new ObjectOutputStream(outputStream);



        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
return null;     

}


public static void main(String[] args) throws IOException {


Average.Builder avger = Average.newBuilder();

//avger.mergeFrom();

try{
    avger.mergeFrom(new FileInputStream(args[0]));


}
 catch (IOException e) {
      System.out.println(args[0] + ": File not found.  Creating a new file.");
    }

    FileOutputStream output = new FileOutputStream(args[0]);// This is where              my error occurs.
    avger.build().writeTo(output);
    output.close();
}

}

这是我的服务器代码:

public class google_sr {


static void average(Average average){



List<Double> list = new ArrayList<Double>();

list = Array.newBuilder().getArraysList();

double max = 0.00;
Double sum = 0.00;

  if(!list.isEmpty()) {
    for (int i =1; i<15000;i++) {

        sum += list.get(i);
    }
   max= sum.doubleValue() / list.size();
  }

  Average.Builder avg = Average.newBuilder();
  System.out.println(avg.setAverages((int)max));

}


 public static void main(String[] args) throws Exception {

google_sr p = new google_sr();
     Average averag = Average.parseFrom(new FileInputStream(args[0]));//Where my error occurs
     average(averag);
        if (args.length != 1) {

          System.err.println("Usage Error");
          System.exit(-1);
        }

 }
  }

最后,这是我的原型文件:

message Array{
repeated double arrays = 1;
}

message Array2{

repeated Array arrays=1;

}

message Average{
optional int32 averages =1;

}

这是我的stacktrace:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at cisc_434_google_protocol.google_cl.main(google_cl.java:82)

2 个答案:

答案 0 :(得分:1)

您没有在args [0]中传递fileName作为参数。你有错误的地方检查:创建文件后,你正在检查args.length。更改代码语句的顺序,以便首先检查args.length,然后创建文件。

试试这段代码。

if ( args.length != 1){
    System.out.println("Exiting program. Usage: java google_cl fileName");
    System.exit(-1);
}
google_sr p = new google_sr();
Average averag = Average.parseFrom(new FileInputStream(args[0]));
average(averag);
  1. 如果您使用命令行运行程序,请将程序称为

    java google_cl someFileName

  2. 如果您使用的是像eclipse这样的IDE,请右键单击java类名称 - &gt;点击Run As - &gt;运行配置 - &gt;参数 - &gt;计划安排。在程序参数中添加fileName。

答案 1 :(得分:0)

  

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:0
      在cisc_434_google_protocol.google_cl.main(google_cl.java:82)

表示在您的类的第82行,您正在尝试访问数组的第一项,但该数组为空。

如果这是第82行:

Average averag = Average.parseFrom(new FileInputStream(args[0]));

这意味着args为空。换句话说,你没有向你的程序传递任何参数。