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

时间:2016-09-27 01:41:23

标签: java

我刚开始学习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<n)
            {
                visited[x+1][y]=1;
                matrix[x+1][y]=i;
                i++;
                dfs(n,x+1,y,i,2);
            }
            else dfs(n,x,y,i,3);
            break;
        }
        case(3)://left
        {
            if(visited[x][y-1]==0&&y-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<<endl;
    }
}
int main()
{
    cin>>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<n)
                    {
                        visited[x+1][y]=1;
                        matrix[x+1][y]=i;
                        i++;
                        dfs(x+1,y,i,2);
                    }
                    else dfs(x,y,i,3);
                    break;
                }
                case(3):
                {
                    if(visited[x][y-1]==0&&y-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)


<terminated, exit value: 1>C:\Program Files\Java\jre1.8.0_101\bin\javaw.exe (2016年9月27日 上午9:51:32)  

the crash scene

1 个答案:

答案 0 :(得分:1)

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

非常非常脏的方式

如果有疑问,你可以依靠一个好的旧System.out.println(yourobject)。小心对象,永远不要忘记你可以将它们变成String并检查内部对象(例如,在你的情况下,visited[1][2]matrix[2][0])。 很糟糕。真。这可能足以满足您的需求,但这是一个不好的习惯。

&#39;好的&#39;方式(编辑)

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

优雅而优雅的方式

了解一下名为debug mode的工具。您可以找到更多帮助on the Eclipse help center,但基本上步骤如下:

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

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