虽然错误在
,但我找不到我的例外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++;
}
}
}
}
答案 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.length
和grid[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
开始。我没有测试过,但你可以尝试一下。