线程" main"中的例外情况java.lang.ArrayIndexOutOfBoundsException:15

时间:2014-05-29 05:33:42

标签: java indexoutofboundsexception

虽然错误在

,但我找不到我的例外
at puzzle.Puzzle.isSafe(Puzzle.java:97)
    at puzzle.Puzzle.main(Puzzle.java:49)
Java Result: 1

我需要在6个方向上打印带有随机单词的15x 15网格,并在空白处开始。

我的java代码如下。

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package puzzle;

//import java.util.Arrays;

import java.util.Random;

/**
*
* @author sony
*/
public class Puzzle {
static char[][] grid;

//class solve= new Puzzle();



/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
     grid =new char[15][15];
    String[] words={"hello","coward","heartbeat","beautiful","kind"};
    String[] direction = {"horizontal","horizontalBack","vertical","varticalUp",
                 "diagonal","diagonalBack"};

int i,j,x,y,dir;
Random randGen = new Random();
    for(i=0; i<15 ;i++)
    {
        for(j=0;j<15;j++)
        grid[i][j]='*';
    }


    for(i=0;i< words.length;i++)
    {
        int set=0;
        while(set!=1)
        {
            x =  randGen.nextInt(15);
            y =  randGen.nextInt(15);
            dir = randGen.nextInt(6);
            if((isSafe(x,y,words[i],direction[dir])))
            {
                place(x,y,words[i],direction[dir]);
                set=1;
            }

        }
    }

    for(i=0; i<15; i++)
     {
      for(j=0;j<15;j++)
          System.out.print(grid[i][j]);
      System.out.println("");
     }


} 
   static boolean isSafe(int x,int y, String word, String d)
   {  int len=word.length();
   int i,k,j;
       if(d.equals("horizontal"))
           for(i=y,k=0;i< (y+len);i++,k++)
           {
               if((grid[x][i]!='*')&& (grid[x][i]!=word.charAt(k)) && ((y+len) >15) )
                   return false;
           }
       if(d.equals("horizontalBack"))
           for(i=y,k=0;i >(y-len);i--,k++)
           {
               if((grid[x][i]!='*')&& (grid[x][i]!=word.charAt(k)) && ((y-len) <0)  )
                   return false;
           }
       if(d.equals("vertical"))
           for(i=x,k=0;i <(x+len);i++,k++)
           {
               if((grid[i][y]!='*')&& (grid[i][y]!=word.charAt(k)) && ((x+len) >15)  )
                   return false;
           }
         if(d.equals("verticalUp"))
           for(i=x,k=0;i >(x+len);i++,k++)
           {
               if((grid[i][y]!='*')&& (grid[i][y]!=word.charAt(k)) && ((x-len) <0)  )
                   return false;
           }
         if(d.equals("diagonal"))
         {   k=0;i=y;j=x;
             while((i< (y+len)) && (j< x+len))               {
               if((grid[i][j]!='*')&& (grid[i][j]!=word.charAt(k)) && ((x+len) >15) &&       ((y+len)>15)   )
               {return false;}
               i++;j++;k++;
           }

         }
         if(d.equals("diagonalBack"))
         {   k=0;i=y;j=x;
             while((i> (y-len)) && (j>x-len))               {
               if((grid[i][j]!='*')&& (grid[i][j]!=word.charAt(k)) && ((x-len)<0) && ((y-len)<0)   )
               {return false;}
               i--;j--;k++;
           }

         }


      return true;       


   }

 static void place(int x, int y, String word, String d)
   {  int len = word.length();
   int i,k,j;
       if(d.equals("horizontal"))
           for( i=y, k=0;i< (y+len);i++,k++)
           {
               grid[x][i]=word.charAt(k);
           }

   if(d.equals("horizontalBack"))
           for( i=y,k=0;i> (y-len);i--,k++)
           {
               grid[x][i]=word.charAt(k);
           }
    if(d.equals("vertical"))
           for( i=x,k=0;i< (x+len);i++,k++)
           {
               grid[i][y]=word.charAt(k);
           }

   if(d.equals("verticalUp"))
           for( i=x,k=0;i> (x-len);i--,k++)
           {
               grid[i][y]=word.charAt(k);
           }
   if(d.equals("diagonal"))
   { i=y;j=x;k=0;
           while((i< (y+len)) && (j< (x+len))) 
           {
               grid[i][j]=word.charAt(k);
               i++;j++;k++;

           }

   }
   if(d.equals("diagonalUp"))
   { i=y;j=x;k=0;
           while((i> (y-len)) && (j> (x-len))) 
           {
               grid[i][j]=word.charAt(k);
               i--;j--;k++;

           }

   }




   }

}

4 个答案:

答案 0 :(得分:2)

我不会告诉您如何修复代码,而是帮助您了解错误。

<强>日志

at puzzle.Puzzle.isSafe(Puzzle.java:97)
    at puzzle.Puzzle.main(Puzzle.java:49)
Java Result: 1

<强> Puzzle.java:97

if (grid[i][j]!='*' && grid[i][j]!=word.charAt(k) && (x+len)>15 && (y+len)>15)

<强>异常

例外java.lang.ArrayIndexOutOfBoundsException意味着:

  • i >= grid.length

  • j >= grid[i].length

<强>详细

创建数组时确定

grid.lengthgrid[i].length

grid = new char[15][15];

grid.length is 15

grid[i].length is 15

<强>此外

此外,还有字符串word

for (i=y, k=0; i < (y+len); i++, k++)
    word.charAt(k);

这也会导致问题,当k在某个时刻变为k >= word.length()时,循环应如下所示:

for (i=y, k=0; i < (y+len) && k < word.length(); i++, k++)
    word.charAt(k);

答案 1 :(得分:0)

我可以看到两个错误。

(1)读取的行

for(i=x,k=0;i >(x+len);i++,k++)

应该阅读

for(i=x,k=0;i >(x-len);i--,k++)

我认为这是第89行。

(2)导致此异常的错误在于,每当您将大量条件分隔为&&时,第一个条件应为&&,后续条件应为||if((grid[x][i]!='*')&& (grid[x][i]!=word.charAt(k)) && ((y+len) >15)) {

例如,

if((grid[x][i]!='*')&& (grid[x][i]!=word.charAt(k)) || ((y+len) >15)) {

应该阅读

y + len > 15

因为您需要返回此广场是一个不安全的地方,如果{{1}}启动该字,无论您正在检查的每个网格方块上找到什么。同样,所有其他条件都是这样的。

答案 2 :(得分:0)

请注意错字。数组声明中的varticalUp和if条件中的verticalUp。虽然这不是问题的原因,但值得注意。

答案 3 :(得分:-1)

我刚刚快速浏览了您的代码,似乎问题出在您的变量len中。请参阅第68行的语句int len=word.length();。实际上它应该是int len=word.length()-1;,因为数组索引从0开始。我没有测试过,但你可以尝试一下。