Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 - Fatal编程技术网

忽略JAVA越界异常的简单方法

忽略JAVA越界异常的简单方法,java,Java,我正在创建一个类似扫雷舰的应用程序,并有一些代码,旨在检查非布雷空间周围有多少地雷。我创造了这样的东西 int count = 0; if(model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE){ count++;} if(model.get(i, j-1) == MinerGridCo.UNTURNED_MINE){ count++;} if(model.

我正在创建一个类似扫雷舰的应用程序,并有一些代码,旨在检查非布雷空间周围有多少地雷。我创造了这样的东西

int count = 0;
                if(model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
                if(model.get(i, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
                if(model.get(i-1, j) == MinerGridCo.UNTURNED_MINE){ count++;}
                if(model.get(i+1, j) == MinerGridCo.UNTURNED_MINE){ count++;}
                if(model.get(i, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
                if(model.get(i-1, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
                if(model.get(i+1, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
                if(model.get(i+1, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
                String mineNum = String.valueOf(count);
                cell[i][j].setText(mineNum);
然而,这会产生错误,当目的是获得地雷号码周围的董事会的边缘。有什么有用的方法来避免这种情况吗


在尝试了下面的建议之后。我仍然会犯越界错误。任何人都有任何建议,如果有人想自己编译,这里是repo创建一行函数:

布尔校验边界i,int j{ //待办事项 }


然后在执行模型查找之前检查是否创建单线函数:

布尔校验边界i,int j{ //待办事项 }


然后,在进行模型查找之前,检查是否使用短路,并编写一个函数isInGridint x,int y来检查位置是否在网格中

public boolean isInGrid(int x, int y) {
    //Check if a position is valid in the grid
    if(i < 0 || j < 0) return false;
    if(i >= WIDTH || j >= HEIGHT) return false;
    return true;
}

...

if(isInGrid(i-1, j-1) && model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE) count++;
if(isInGrid(i+1, j+1) && model.get(i+1, j+1) == MinerGridCo.UNTURNED_MINE) count++;
//Repeat for each location you want to check
如果第一个条件isInGridi-1,j-1为非真,则该条件将在不运行[condition]语句的情况下退出。这样,如果[condition]失败,您就可以阻止它执行


这被称为短路——这是一种优化,如果已知代码无法运行,则会导致if条件检查退出。您可以在要计算的每个语句之前放置一个isInGrid检查,如果位置不在网格中,它将不会执行get。

使用短路,并编写一个函数isInGridint x,int y来检查位置是否在网格中

public boolean isInGrid(int x, int y) {
    //Check if a position is valid in the grid
    if(i < 0 || j < 0) return false;
    if(i >= WIDTH || j >= HEIGHT) return false;
    return true;
}

...

if(isInGrid(i-1, j-1) && model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE) count++;
if(isInGrid(i+1, j+1) && model.get(i+1, j+1) == MinerGridCo.UNTURNED_MINE) count++;
//Repeat for each location you want to check
如果第一个条件isInGridi-1,j-1为非真,则该条件将在不运行[condition]语句的情况下退出。这样,如果[condition]失败,您就可以阻止它执行


这被称为短路——这是一种优化,如果已知代码无法运行,则会导致if条件检查退出。您可以在要计算的每个语句之前放置其中一个isInGrid检查,如果位置不在网格中,它将不会执行get。

帮自己一个忙,然后创建模型。countUnturnedMinesAroundi,j。然后在模型内部,您有一些选项

您可以创建视图看不到的额外行/列,这样您就可以轻松地处理一个索引

或者您可以编写一个函数private Cell getCelli,j,当i和j越界时,该函数将返回默认的空单元格


或者,当i或j离开网格时,您可以使用返回false的布尔值hasUnturnedMinei,j。

帮自己一个忙,创建模型。CountUnturnedMinesRoundi,j。然后在模型内部,您有一些选项

public boolean isInGrid(int x, int y) {
    //Check if a position is valid in the grid
    if(i < 0 || j < 0) return false;
    if(i >= WIDTH || j >= HEIGHT) return false;
    return true;
}

...

if(isInGrid(i-1, j-1) && model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE) count++;
if(isInGrid(i+1, j+1) && model.get(i+1, j+1) == MinerGridCo.UNTURNED_MINE) count++;
//Repeat for each location you want to check
您可以创建视图看不到的额外行/列,这样您就可以轻松地处理一个索引

或者您可以编写一个函数private Cell getCelli,j,当i和j越界时,该函数将返回默认的空单元格


或者,当i或j离开网格时,可以使用返回false的布尔hasunnedMinei,j。

可以避免循环重复:

public boolean isInGrid(int x, int y) {
    //Check if a position is valid in the grid
    if(i < 0 || j < 0) return false;
    if(i >= WIDTH || j >= HEIGHT) return false;
    return true;
}

...

if(isInGrid(i-1, j-1) && model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE) count++;
if(isInGrid(i+1, j+1) && model.get(i+1, j+1) == MinerGridCo.UNTURNED_MINE) count++;
//Repeat for each location you want to check
for (int iOffset = -1; iOffset <= 1; iOffset++) {
    for (int jOffset = -1; jOffset <= 1; jOffset++) {
        if (iOffset != 0 || jOffset != 0) {
            if (isInGrid(i + iOffset, j + jOffset) && 
                model.get(i + iOffset, j + jOffset) == MinerGridCo.UNTURNED_MINE) {
                    count++;
            }
        }
    }
}

使用@Emrakul的答案建议的isInGrid函数,我实际上将范围检查和未翻转的矿井检查合并为一个hasUnturnedMine函数,如@Arkadiy的答案所述。

您可以避免重复循环:

for (int iOffset = -1; iOffset <= 1; iOffset++) {
    for (int jOffset = -1; jOffset <= 1; jOffset++) {
        if (iOffset != 0 || jOffset != 0) {
            if (isInGrid(i + iOffset, j + jOffset) && 
                model.get(i + iOffset, j + jOffset) == MinerGridCo.UNTURNED_MINE) {
                    count++;
            }
        }
    }
}

使用@Emrakul的答案建议的isInGrid函数,我实际上会将范围检查和未用尽的检查组合成一个hasUnturnedMine函数,如@Arkadiy的答案中所述。

另一种方法是使用一个方法isBorderint I,int j,让您知道自己是否在边界上。如果它不是边界,你知道你可以安全地检查i,j周围的所有方块。如果它在边框上,您可以计算它是左/右/上/下边框还是4个不超过2个的组合,然后选中相应的框


免责声明:我假设您已经在进行检查,以确保I,j是网格上的有效位置。无论您的实现如何,您都应该对此进行检查

另一种方法是使用一个方法isborderinti,intj,它可以让您知道您是否在边界上。如果它不是边界,你知道你可以安全地检查i,j周围的所有方块。如果它在边框上,您可以计算它是左/右/上/下边框还是4个不超过2个的组合,然后选中相应的框

免责声明:我假设您已经在进行检查,以确保I,j是网格上的有效位置。无论您的实现如何,您都应该对此进行检查

有更好的方法可以做到这一点,方法是更好地构造代码。但是,以下是您具体问题的答案:

Java中忽略异常的方式是使用try-catch块。这允许您尝试运行代码块,捕获抛出的任何异常,然后决定如何处理它们,包括忽略它们

假设您的越界异常来自model.get调用 你可以这样忽略它们:

int count = 0;
try
{
    if(model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i-1, j) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i+1, j) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i-1, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i+1, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i+1, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
}
catch (IndexOutOfBoundsException ex)
{
    // Do nothing
}
String mineNum = String.valueOf(count);
cell[i][j].setText(mineNum);
但是,当遇到异常时,将跳过try块中的所有后续代码。这绝对不是你想要的,因为你会错过一些邻接的检查。 相反,您需要对model.get的每个调用执行try-catch。这最好通过创建布尔函数来实现,如:

// Change method visibility and signature accordingly to match your code
public static boolean tileHasMine(int x, int y)
{
    try
    {
        if (model.get(x, y) == MinerGridCo.UNTURNED_MINE)
        {
            return true;
        }
    }
    catch (IndexOutOfBoundsException ex)
    {
        // Do Nothing
    }
    return false;
}
那么,您的支票将如下所示:

int count = 0;
if(tileHasMine(i-1, j-1)){ count++;}
if(tileHasMine(i, j-1)){ count++;}
if(tileHasMine(i-1, j)){ count++;}
if(tileHasMine(i+1, j)){ count++;}
if(tileHasMine(i, j+1)){ count++;}
if(tileHasMine(i-1, j+1)){ count++;}
if(tileHasMine(i+1, j-1)){ count++;}
if(tileHasMine(i+1, j+1)){ count++;}
String mineNum = String.valueOf(count);
cell[i][j].setText(mineNum);
或者,您可以编写一个布尔函数,在尝试读取之前,首先检查块是否超出模型的边界,这可能是一种更好的方法。但我认为这正是您所要求的。

有更好的方法可以做到这一点,方法是更好地构建代码。但是,以下是您具体问题的答案:

Java中忽略异常的方式是使用try-catch块。这允许您尝试运行代码块,捕获抛出的任何异常,然后决定如何处理它们,包括忽略它们

假设您的越界异常来自model.get调用,您可以这样忽略它们:

int count = 0;
try
{
    if(model.get(i-1, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i-1, j) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i+1, j) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i-1, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i+1, j-1) == MinerGridCo.UNTURNED_MINE){ count++;}
    if(model.get(i+1, j+1) == MinerGridCo.UNTURNED_MINE){ count++;}
}
catch (IndexOutOfBoundsException ex)
{
    // Do nothing
}
String mineNum = String.valueOf(count);
cell[i][j].setText(mineNum);
但是,当遇到异常时,将跳过try块中的所有后续代码。这绝对不是你想要的,因为你会错过一些邻接的检查。 相反,您需要对model.get的每个调用执行try-catch。这最好通过创建布尔函数来实现,如:

// Change method visibility and signature accordingly to match your code
public static boolean tileHasMine(int x, int y)
{
    try
    {
        if (model.get(x, y) == MinerGridCo.UNTURNED_MINE)
        {
            return true;
        }
    }
    catch (IndexOutOfBoundsException ex)
    {
        // Do Nothing
    }
    return false;
}
那么,您的支票将如下所示:

int count = 0;
if(tileHasMine(i-1, j-1)){ count++;}
if(tileHasMine(i, j-1)){ count++;}
if(tileHasMine(i-1, j)){ count++;}
if(tileHasMine(i+1, j)){ count++;}
if(tileHasMine(i, j+1)){ count++;}
if(tileHasMine(i-1, j+1)){ count++;}
if(tileHasMine(i+1, j-1)){ count++;}
if(tileHasMine(i+1, j+1)){ count++;}
String mineNum = String.valueOf(count);
cell[i][j].setText(mineNum);


或者,您可以编写一个布尔函数,在尝试读取之前,首先检查块是否超出模型的边界,这可能是一种更好的方法。但我认为这就是您要问的。

模型是什么数据类型?忽略异常总是一个坏主意。在这种情况下,编写代码来处理edge条件。例如,使用签名列表GetNeightrsCell编写一个方法,给定一个单元格,该单元格返回要检查的有效邻居列表。然后只检查那些邻居。模型是GUI的一个模型元素,它只是MinerGridCo类的一个实例,它包含这些未转换的元素,这些元素只是专门声明的整数。您可以始终使用try/catch,但如果您不了解自己在做什么,这是很危险的。试着想象你所知道的所有生命瞬间停止,你体内的每个分子都以光速爆炸。顺便问一下,你想过使用循环吗?对于int x=-1;模型是什么数据类型?忽略异常总是一个坏主意。在这种情况下,编写代码来处理edge条件。例如,使用签名列表GetNeightrsCell编写一个方法,给定一个单元格,该单元格返回要检查的有效邻居列表。然后只检查那些邻居。模型是GUI的一个模型元素,它只是MinerGridCo类的一个实例,它包含这些未转换的元素,这些元素只是专门声明的整数。您可以始终使用try/catch,但如果您不了解自己在做什么,这是很危险的。试着想象你所知道的所有生命瞬间停止,你体内的每个分子都以光速爆炸。顺便问一下,你想过使用循环吗?对于int x=-1;我想到了这一点,但唯一的问题是我必须对每一个案例进行检查。例如,右下角的大小写必须在2D数组中,并且必须小于最大高度和宽度,计数才能有效,左上角的大小写必须大于0。我不确定问题出在哪里?检查边界并不局限于只覆盖一个角的情况。@PhillOliver是的,你需要检查每一个案例我想到了这一点,但唯一的问题是我必须对每一个案例进行检查边界。例如,右下角的大小写必须在2D数组中,并且必须小于最大高度和宽度,计数才能有效,左上角的大小写必须大于0。我不确定问题出在哪里?检查边界并不局限于只覆盖一个角的大小写。@PhillOliver是的,您需要检查每个角的大小写。唯一的问题是我包含的一些if语句需要调用。如果我要检查的对象在左上角,它必须检查右下角和右下角的对象,如果对象在右下角,这是不同的。@Phill您可以创建任意数量的这些语句。将isInGrid条件放在每个语句之前,如果位置不在网格中,则get将不会运行。抱歉,我明白你的意思。好主意我们将实施这一目标。正如旁注一样,上面示例中的代码在传递给它的变量名和使用的变量名之间存在差异。这不应该是ifi>=WIDTH | | j>=HEIGHT吗?我假设有效范围应该是0到宽度-1和0到高度-1(包括宽度-1和高度-1)。唯一的问题是
需要调用我包含的if语句中的一个。如果我要检查的对象在左上角,它必须检查右下角和右下角的对象,如果对象在右下角,这是不同的。@Phill您可以创建任意数量的这些语句。将isInGrid条件放在每个语句之前,如果位置不在网格中,则get将不会运行。抱歉,我明白你的意思。好主意我们将实施这一目标。正如旁注一样,上面示例中的代码在传递给它的变量名和使用的变量名之间存在差异。这不应该是ifi>=WIDTH | | j>=HEIGHT吗?我假设有效范围应该是0到宽度-1和0到高度-1(包括宽度-1和高度-1)。我实现了这一点,当它达到12时,由于某种原因,该值似乎达到了一个越界错误,这让我非常困惑。12是我为董事会指定的最大高度和宽度。我已经在标题中添加了我的github repo,因为我无法理解为什么代码仍然抛出这些exceptions@PhillOliver我注意到@Emrakul的回答是如果我>宽度| | j>高度。。如果i>=WIDTH | | j>=HEIGHT,可能就是这样。P.S.还没有看过你的回购协议。我实现了这个,当它达到12时,这个值似乎达到了一个越界错误,因为某种原因,这让我很困惑。12是我为董事会指定的最大高度和宽度。我已经在标题中添加了我的github repo,因为我无法理解为什么代码仍然抛出这些exceptions@PhillOliver我注意到@Emrakul的回答是如果我>宽度| | j>高度。。如果i>=WIDTH | | j>=HEIGHT,可能就是这样。P.S.还没看过你的回购协议。