连接四个OutOfBoundsException

时间:2014-08-06 12:34:57

标签: java exception

此代码非常粗糙,不完整,并且不以任何方式专业。我收到了:

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:-1     在ConnectFourGame.main(ConnectFourGame.java:63)

任何时候我尝试输入一个列显示出来。我一直在查看我的代码,我的父亲也是如此,我们无法找到错误的位置。任何帮助都会很棒!

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ConnectFourGame
{
    public static void main(String[] args)
    {
        int[][] grid = new int[6][7];
        int i, j, temp, player=0, inarowl=0, inarowr=0, temprow=0, inarowd=0, tempcol=0;
        boolean legal = true;
        boolean gameover = false;
        //Initializing game board
        for(i=0;i<6;i++)
            for(j=0;j<7;j++)
                grid[i][j] = 0;

        //ALL GAME LOGIC
        do {
        i=0;
        j=0;
            //PLAYER 1
               //check for diagonals next
            do {
                i=0;
                j=0;
                player=1;
                //player places chip
                temp=Integer.parseInt(JOptionPane.showInputDialog(null, "pick your column( 0 / 1 / 2 / 3 / 4 / 5 / 6 )"));
                for(i=0;i<6;i++)
                    {
                        if(grid[i][temp]==0)
                            //detects lowest available chip slot in the column for placement
                        {  // and turns that spot into a box owned by the player
                                grid[i][temp]=player;
                                legal=true;
                                temprow=i;
                                tempcol=temp;
                                    break;  
                        }else legal=false;
                    }
            }
            while(!legal);
            inarowl=0;
            inarowr=0;
            tempcol=temp;
            do
            {
            tempcol--;
            inarowl++;
            }while(grid[temprow][tempcol]==player); 
            tempcol=temp;   
            do
            {
            tempcol++;
            inarowr++;
            }while(grid[temprow][tempcol]==player);

            do
            {
            temprow--;
            inarowd++;
            }while(grid[temprow][tempcol]==player);
            if (inarowl+inarowr-1>=4||inarowd>=4)
            gameover=true;
            //PLAYER 2
                //check for diagonals next
            do {
                i=0;
                j=0;
                player=2;
                temp=Integer.parseInt(JOptionPane.showInputDialog(null, "pick your column( 0 / 1 / 2 / 3 / 4 / 5 / 6 )"));
                for(i=0;i<6;i++)
                    {
                        if(grid[i][temp]==0)
                        {
                                grid[i][temp]=player;
                                legal=true;
                                temprow=i;
                                tempcol=temp;
                                    break;  
                        }else legal=false;
                    }
            }
            while(!legal);
            inarowl=0;
            inarowr=0;
            tempcol=temp;
            do
            {
            tempcol--;
            inarowl++;
            }while(grid[temprow][tempcol]==player); 
            tempcol=temp;   
            do
            {
            tempcol++;
            inarowr++;
            }while(grid[temprow][tempcol]==player);

            do
            {
            temprow--;
            inarowd++;
            }while(grid[temprow][tempcol]==player);
            if (inarowl+inarowr-1>=4||inarowd>=4)
            gameover=true;          
        } while(gameover==false);       
    }
}

2 个答案:

答案 0 :(得分:0)

这段代码可能触发一个超出范围的异常:如果grid [temprow] [0] == player,则tempcol减少(到-1),并且将评估grid [temprow] [ - 1]。

do
{
  tempcol--;
  inarowl++;
}while(grid[temprow][tempcol]==player); 

在while条件下,还必须确保数组索引仍然在数组的范围内。

 while (grid[temprow][tempcol] == player && tempcol > 0 && tempcol < grid[temprow].length)

答案 1 :(得分:0)

我看到的主要问题是您正在使用do... while(condition)循环。在这种情况下,问题是您首先减去整数然后使用相同的整数来访问内存位置。

这种方法的问题在于,由于您在减去之前进行检查,因此您尝试访问负内存位置。要解决此问题,请改用while(condition)循环。这将允许您在之前执行检查进行数组操作,这将允许您及时打破循环。