Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java列表的数组索引越界异常错误_Java_Arrays_Exception_Arraylist_Protocol Buffers - Fatal编程技术网

java列表的数组索引越界异常错误

java列表的数组索引越界异常错误,java,arrays,exception,arraylist,protocol-buffers,Java,Arrays,Exception,Arraylist,Protocol Buffers,我正在尝试将2d数组放入2d列表中。我正在构建一个google protobuf。我不明白我为什么抛出异常。我在stack上尝试了多个建议,但没有一个能提供帮助 这是我的客户端代码: public class google_cl extends Thread { static Array createArray() throws IOException{ Array.Builder array = Array.newBuilder(); double[][]array

我正在尝试将2d数组放入2d列表中。我正在构建一个google protobuf。我不明白我为什么抛出异常。我在stack上尝试了多个建议,但没有一个能提供帮助

这是我的客户端代码:

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();
}

}
这是我的stacktrace:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at cisc_434_google_protocol.google_cl.main(google_cl.java:82)
线程“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
为空。换句话说,您没有向程序传递任何参数。

您没有将args[0]中的文件名作为参数传递。您在错误的位置进行了检查:创建文件后,您正在使用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);
  • 如果使用命令行运行该程序,请按以下方式调用该程序:

    java谷歌文件名

  • 如果您使用的是类似于eclipse的IDE,请右键单击java类名->单击运行方式->运行配置->参数->程序段。在程序参数中添加文件名


  • 将stacktracepost张贴到控制台输出上,这样问题就清楚了刚才所做的,@sanjaysinghrawat看起来该尝试有一个未捕获的索引越界异常,这就是错误出现在它之后的原因。我养成的一个好习惯是,在对参数进行任何操作之前,先对args长度进行if检查。如果您正在使用任何IDE,如eclipse,请签出-确切地说。。正如@CrakC所提到的。。您必须传递命令行参数,因为您似乎试图获取命令行数据,但没有传递它。
    Average averag = Average.parseFrom(new FileInputStream(args[0]));
    
    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);