Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查网格,抛出越界异常_Java_Arrays_Exception - Fatal编程技术网

Java 检查网格,抛出越界异常

Java 检查网格,抛出越界异常,java,arrays,exception,Java,Arrays,Exception,目前,我正在尝试检查网格单元格周围所有单元格中的数据。上、左、下、右和所有对角线。我如何使用异常抛出,这样我就不必对边和角单独编码了 这就是我目前拥有的。isIsAlive()只是检查单元格是否处于“活动”状态。单元的邻居包括其周围的所有活动单元 public void calcNeighbors() throws ArrayIndexOutOfBoundsException{ int x =0; int y =0; int neighbors = 0;

目前,我正在尝试检查网格单元格周围所有单元格中的数据。上、左、下、右和所有对角线。我如何使用异常抛出,这样我就不必对边和角单独编码了

这就是我目前拥有的。isIsAlive()只是检查单元格是否处于“活动”状态。单元的邻居包括其周围的所有活动单元

    public void calcNeighbors() throws ArrayIndexOutOfBoundsException{

    int x =0;

    int y =0;
    int neighbors = 0;



    while(x < 9){
        while(y < 9){

            if(generation[x+1][y+1].isIsAlive()){
                neighbors++;

            }
             if(generation[x+1][y].isIsAlive()){
                neighbors++;
            }
              if(generation[x+1][y-1].isIsAlive()){
                neighbors++;
            }
               if(generation[x][y-1].isIsAlive()){
                neighbors++;
            }
                if(generation[x-1][y-1].isIsAlive()){
                neighbors++;
            }
                 if(generation[x-1][y].isIsAlive()){
                neighbors++;
            }
                 if(generation[x-1][y+1].isIsAlive()){
                neighbors++;
            }
                 if(generation[x][y+1].isIsAlive()){
                neighbors++;
            }
            y++;
        }
        x++;
        neighbors = 0;
    }
}
public void calcNeighbors()引发ArrayIndexOutOfBoundsException{
int x=0;
int y=0;
int=0;
而(x<9){
而(y<9){
如果(生成[x+1][y+1].isIsAlive()){
邻居++;
}
如果(生成[x+1][y].isIsAlive()){
邻居++;
}
如果(生成[x+1][y-1].IsSalive()){
邻居++;
}
if(生成[x][y-1].isIsAlive()){
邻居++;
}
if(生成[x-1][y-1].isIsAlive()){
邻居++;
}
if(生成[x-1][y].isIsAlive()){
邻居++;
}
如果(生成[x-1][y+1].isIsAlive()){
邻居++;
}
如果(生成[x][y+1].isIsAlive()){
邻居++;
}
y++;
}
x++;
邻居=0;
}
}

您的if块列表丑陋(直截了当)且危险。而是使用嵌套for循环,但计算for循环的上下界,同时考虑边

for (int x = 0; x < MAX_X; x++) {
  for (int y = 0; y < MAX_Y; y++) {

    int minRow = Math.max(0, x - 1);
    int maxRow = Math.min(MAX_X - 1, x + 1);
    int minCol = Math.max(0, y - 1);
    int maxCol = Math.min(MAX_Y - 1, y + 1);

    for (int row = minRow; row <= maxRow; row++) {
      for (int col = minCol; col <= maxCol; col++) {
         if (row != x || col != y) {
           if(generation[row][col].isIsAlive()){
             neighbors[x, y]++;
           }
         }
      }
    }
  }
}
for(int x=0;xfor(int row=minRow;row您的if块列表很难看(很钝)也很危险。请改用嵌套for循环,但计算for循环的上界和下界时要考虑边

for (int x = 0; x < MAX_X; x++) {
  for (int y = 0; y < MAX_Y; y++) {

    int minRow = Math.max(0, x - 1);
    int maxRow = Math.min(MAX_X - 1, x + 1);
    int minCol = Math.max(0, y - 1);
    int maxCol = Math.min(MAX_Y - 1, y + 1);

    for (int row = minRow; row <= maxRow; row++) {
      for (int col = minCol; col <= maxCol; col++) {
         if (row != x || col != y) {
           if(generation[row][col].isIsAlive()){
             neighbors[x, y]++;
           }
         }
      }
    }
  }
}
for(int x=0;x对于(int row=minRow;row,如果假设的邻居超出边界,则不应抛出自己的异常。Java无论如何都会抛出一个
ArrayIndexOutOfBoundsException


在访问数组之前,需要检查边界;如果
x
y
超出范围,则不要访问数组。

如果假设的邻居超出边界,则不应引发自己的异常。Java无论如何都会引发
ArrayIndexOutOfBoundsException


在访问数组之前,您需要检查边界;如果
x
y
超出范围,则不要访问数组。

不建议为此使用异常。但是,如果您坚持,您可以通过以下方式来做。首先,定义一个方法

public boolean isAlive(int x,int y) {
    try {
        return this.generation[x][y].isIsAlive() ;
    } catch(IndexOutOfBoundsException ex) {
        return false ;    //  Or whatever you want to be the default
    }
}
然后使用
isAlive(x+1,y+1)
而不是
generation[x+1][y+1].isIsAlive()
等等

此外,我的印象是,您错误地声明了一个局部变量
int neights=0;
。我这样说是因为您在最后一直将其设置为
0
,但您没有将其存储在任何地方。我个人会在
generation
的基类中定义一个字段
neights
,并且:

for(int x= 0 ; x < generation.length ; x++ ) {
    for(int y= 0 ; y < generation[x].length ; y++ ) {
        generation[x][y].neighbors= 0 ;
        for(int dx= -1 ; dx <= 1 ; dx++ ) {
            for(int dy= -1 ; dy <= 1 ; dy++ ) {
              if( ! ( dx == 0 && dy == 0 ) && isAlive(x+dx,y+dx) ) {
                  generation[x][y].neighbors++;
              }
        }
    }
}
现在,没有滥用异常(这是目前最推荐的),我想说添加一个函数

public boolean isValidNeighbor(int i,int j) {
    return 0 <= i && i < generation.length && 0 <= j && j < generation[i].length ;
}
公共布尔值isValidNeighbor(int i,int j){

返回0不建议为此目的使用异常。但是如果您坚持,可以通过以下方式执行。首先,定义一个方法

public boolean isAlive(int x,int y) {
    try {
        return this.generation[x][y].isIsAlive() ;
    } catch(IndexOutOfBoundsException ex) {
        return false ;    //  Or whatever you want to be the default
    }
}
然后使用
isAlive(x+1,y+1)
而不是
generation[x+1][y+1].isIsAlive()
等等

此外,我的印象是,您错误地声明了一个局部变量
int neights=0;
。我这样说是因为您在最后一直将其设置为
0
,但您没有将其存储在任何地方。我个人会在
generation
的基类中定义一个字段
neights
,并且:

for(int x= 0 ; x < generation.length ; x++ ) {
    for(int y= 0 ; y < generation[x].length ; y++ ) {
        generation[x][y].neighbors= 0 ;
        for(int dx= -1 ; dx <= 1 ; dx++ ) {
            for(int dy= -1 ; dy <= 1 ; dy++ ) {
              if( ! ( dx == 0 && dy == 0 ) && isAlive(x+dx,y+dx) ) {
                  generation[x][y].neighbors++;
              }
        }
    }
}
现在,没有滥用异常(这是目前最推荐的),我想说添加一个函数

public boolean isValidNeighbor(int i,int j) {
    return 0 <= i && i < generation.length && 0 <= j && j < generation[i].length ;
}
公共布尔值isValidNeighbor(int i,int j){

返回0答案是:不要。不要对非异常控制流使用异常。这是一个类似的通过预期的代码流问题:除了常见的可读性问题外,我还做了一些效率测试。这会导致糟糕的读取。“太长的未读取”是异常比实例慢20倍(这本身相当慢)根据一般建议;使用“9”是一个神奇的数字;不好。如果数组大小发生变化,请使用array.length。您可以使用array[0].length获得第二个维度。您使用的if语句几乎相同;有点不好。使用两个嵌套for语句,每个语句都介于-1和1之间(如果两者都是0,则使用continue)。这避免了复制和粘贴代码的重复使用,并使您的逻辑在以后发生更改时更易于重写(并为您节省了编写无聊ifs的工作量)您正在使用一段时间模拟for循环。为什么要这样做?这会使代码难以读取,并可能导致代码中出现错误,因为每次通过x循环y都没有重置为0。答案是:不要。不要对非异常控制流使用异常。这是一个类似的通过期望的代码流问题:除了通常的可读性问题我做了一些关于效率的测试。这会导致糟糕的阅读。根据一般建议,“太长时间没有阅读”是异常的速度比一个实例慢20倍(它本身相当慢);使用“9”是一个神奇的数字;