public static void main (String[] args){
double infinity = Double.POSITIVE_INFINITY;
int num = 5;
double[][] W = {{0,1,infinity,1,5},{9,0,3,2,infinity},{infinity,infinity,0,4,infinity},{infinity,infinity,2,0,3},{3, infinity, infinity, infinity,0}}; //Weighted, directed graph
double[][] D = W;
double[][] P = new double[5][5];
for(int i=0; i < num; i++){ //This works, but it throws the exception in the middle of this
System.out.println("");
for(int j=0; j < num; j++){
System.out.print("P["+i+"]"+"["+j+"]: "+ (int)P[i][j] + ", ");
}
}
floyd2(num, W, D, P);
}
private static void floyd2 (int n, double W[][], double D[][], double P[][]){
int i, j, k;
for(i=0; i < n; i++){ //This does not work
for(j=0; j < n; i++){
P[i][j] = 0;
}
}
D = W;
for(k=0; k< n; k++){
for(i=0; i < n; i++){
for(j=0; j < n; j++){
if((D[i][k] + D[k][j]) < D[i][j]){
P[i][j] = k;
D[i][j] = D[i][k] + D[k][j];
}
}
}
}
//Output D
for(i=0; i < n; i++){
for(j=0; j < n; j++){
System.out.print("D["+i+"]"+"["+j+"]: "+ (int)D[i][j] + ", ");
}
}
//Output P
for(i=0; i < n; i++){
for(j=0; j < n; j++){
System.out.print("P["+i+"]"+"["+j+"]: "+ (int)P[i][j] + ", ");
}
}
}
所以,我试图将数组 P 传递给 floyd2,它一直给我一个数组OutOfBoundsExeception,它不喜欢 floyd2 中的第一个 for 循环。什么可能让我出界的阵列?!
如果我删除数组 P,代码会自行工作。
编辑:堆栈跟踪 --
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at com.company.Main.floyd2(Main.java:32)
at com.company.Main.main(Main.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Process finished with exit code 1
此问题是由于您的代码尝试访问不存在的索引。请替换您的代码,
for(j=0; j < n; i++){
P[i][j] = 0;
}
跟
for(j=0; j < n; j++){
P[i][j] = 0;
}
你在 for 循环语句上增加 i 而不是 j,从而导致 ArrayIndexOutOfBoundsException。
for(i=0; i < n; i++){ //This does not work
for(j=0; j < n; i++){
P[i][j] = 0;
}
}
在第二个循环中,你有 i++ 而不是 j++
堆栈跟踪说:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at com.company.Main.floyd2(Main.java:32)
at com.company.Main.main(Main.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
这是循环:
for(i=0; i < n; i++){ //This does not work
for(j=0; j < n; i++){
P[i][j] = 0;
}
}
在此循环中,i
递增两次。所以它变成了n
5
.更改为内部循环中的j++
。
for(i=0; i < n; i++){ //This does not work
for(j=0; j < n; i++){
P[i][j] = 0;
}
}
需要
for(i=0; i < n; i++){
for(j=0; j < n; j++){
P[i][j] = 0;
}
}
确保在 for 循环中增加要测试的相同变量(在本例中为 j
(