我正在尝试将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)
答案 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);
如果您使用命令行运行程序,请将程序称为
java google_cl someFileName
或
如果您使用的是像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
为空。换句话说,你没有向你的程序传递任何参数。