如何在Java程序中调试“java.lang.ArrayIndexOutOfBoundsException”?

我刚刚开始学习Java,我对我的代码有一些疑问。 好吧,任务是得到一个数字并打印一个像这样的矩阵:

get 3,and print: 1 2 3 8 9 4 7 6 5 get 4,and print: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 

因为我正在学习算法,所以我用DFS处理问题,这是我的cpp代码,它可以解决任务。

 #include "iostream" using namespace std; int n; int matrix[100][100]={0}; int visited[100][100]={0}; void dfs(int n,int x,int y,int i,int dire) { //x,y is the coordinate,i is the number to write //dire is the variety to control the direction of the dfs if(i==n*n+1)return; switch(dire) { case(1)://write the number on right { if(visited[x][y+1]==0&&y+1<n) { visited[x][y+1]=1; matrix[x][y+1]=i; i++; dfs(n,x,y+1,i,1); } else dfs(n,x,y,i,2); break; } case(2)://down { if(visited[x+1][y]==0&&x+1=0) { visited[x][y-1]=1; matrix[x][y-1]=i; i++; dfs(n,x,y-1,i,3); } else dfs(n,x,y,i,4); break; } case(4)://up { if(visited[x-1][y]==0&&x-1>=0) { visited[x-1][y]=1; matrix[x-1][y]=i; i++; dfs(n,x-1,y,i,4); } else dfs(n,x,y,i,1); break; } } } void output(int n) { int p,q=0; for(q=0;q<n;q++) { for(p=0;p<n;p++) { cout<<matrix[q][p]<<" "; if(matrix[q][p]<10) cout<<" "; if(matrix[q][p]<100) cout<<" "; } cout<>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { matrix[i][j]=0; visited[i][j]=0; } } ///dfs_r(n,0,-1,1); dfs(n,0,-1,1,1); output(n); } 

但是当我将它翻译成Java时出现问题

 import java.util.Scanner; public class mainclass{ public static class method{ int n; int visited[][]=new int[n][n]; int matrix[][]=new int[n][n]; method(int temp){ n=temp; } void dfs(int x,int y,int i,int dire) { if(i==n*n+1)return; switch(dire) { case(1): { if(visited[x][y+1]==0&&y+1<n) { visited[x][y+1]=1; matrix[x][y+1]=i; i++; dfs(x,y+1,i,1); } else dfs(x,y,i,2); break; } case(2): { if(visited[x+1][y]==0&&x+1=0) { visited[x][y-1]=1; matrix[x][y-1]=i; i++; dfs(x,y-1,i,3); } else dfs(x,y,i,4); break; } case(4): { if(visited[x-1][y]==0&&x-1>=0) { visited[x-1][y]=1; matrix[x-1][y]=i; i++; dfs(x-1,y,i,4); } else dfs(x,y,i,1); break; } } } void output() { int p,q=0; for(q=0;q<n;q++) { for(p=0;p<n;p++) { System.out.print(matrix[q][p]); if(matrix[q][p]<10) System.out.print(" "); if(matrix[q][p]<100) System.out.print(" "); } System.out.println(); } } } public static void main(String args[]){ Scanner reader=new Scanner(System.in); int n=reader.nextInt(); method c=new method(n); c.dfs(0,-1,1,1); c.output(); } } 

我认为我的算法没问题,但我无法理解为什么我的Java代码崩溃了。 我想我应该更多地了解Java的基本语法。

编辑:我使用dev-cpp来运行我的cpp代码和eclipse来运行我的Java代码。 我真的不知道如何描述Eclipse的崩溃是如何得到的,代码是:

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at mainclass$method.dfs(mainclass.java:17) at mainclass.main(mainclass.java:87) C:\Program Files\Java\jre1.8.0_101\bin\javaw.exe (2016年9月27日 上午9:51:32) 

坠机现场

(答案是假设你有一个IDE,比如Eclipse )。

真的,非常脏的方式

当有疑问时,你总是可以依赖一个好的旧System.out.println(yourobject) 。 注意对象,永远不要忘记你可以把它们变成String并检查内部对象(在你的例子中, visited[1][2]matrix[2][0] )。 它很糟糕。 真。 它可能足以满足您的需求,但这是一个不好的习惯。

‘好’的方式(编辑)

使用名为SLF4J的工具获取一些额外的跟踪。 由于你只是一个小方法,而不是一个完整的项目,我不会命令你部署这个工具,但请记住,这是一个很好的方法来弄清楚发生了什么,让你的控制台记录你需要的,特别是当项目变得有趣时(读: 更大 )。

优雅而优雅的方式

了解一个名为debug mode的工具。 您可以在Eclipse帮助中心找到更多帮助,但基本上步骤如下:

  • 放置一个断点。 在代码的左侧(包含行号),您可以右键单击以设置/启用/禁用断点。
  • debug运行您的程序。 这是经典运行图标附近的一个小错误(多么方便)。 您将被重定向到debug perspective
  • 在你打破断点的地方, 中断运行。 在那里,您将能够一步一步地进入您的代码。 您还可以检查您声明的每个变量的状态,以便识别您的问题。
  • [你的工作是做出必要的改变]
  • 现在你了解调试器, ArrayOutOfBoundsException并且由于这种良好的实践, ArrayOutOfBoundsException成为了一个更好的人。

Vogella有一个关于如何以一种很好的方式使用调试器的好教程 。 如果你计划继续使用Java,请学会使用它,因为这将为你节省大量时间(非常多,相信我)。