Java 不确定在尝试调用方法时为什么会出现异常

Java 不确定在尝试调用方法时为什么会出现异常,java,exception,Java,Exception,好的,所以我应该在黑板上放置一艘战舰,使用例外来确保没有违反任何规则。然而,当我尝试调用函数时,我得到了以下结果: Exception in thread "main" java.lang.Error: Unresolved compilation problem: Unhandled exception type Exception at BattleshipBoard.main(BattleshipBoard.java:135) 不是100%确定我做错了什么,如果你们能找

好的,所以我应该在黑板上放置一艘战舰,使用例外来确保没有违反任何规则。然而,当我尝试调用函数时,我得到了以下结果:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Unhandled exception type Exception
    at BattleshipBoard.main(BattleshipBoard.java:135)
不是100%确定我做错了什么,如果你们能找出什么是错的,以及我明显违反的相关规则,我们将不胜感激

以下是相关代码:

public void placeShip(int startCol, int startRow, int endCol, int endRow)
        throws Exception {
            if(startCol > numCols) {
                throw new Exception("0");
            }
            if(startCol < 0 ) {
                throw new Exception("Out of bounds, less than 1(startCol)");
            }
            if (startRow > numRows) {
                throw new Exception("Out of bounds, Greater then numRows");
            }
            if (startRow < 0) {
                throw new Exception("Out of bounds, less than 1 (startRow)");
            }
            if((startCol != endCol) && (startRow != endRow)){
                throw new Exception("Diag");
            }
            if(board[i][j] == 1){
                throw new Exception("Overlap");
            }
            if (startCol == endCol){
                for (i = startCol; i <= endCol; i++ ){
                    board[i][j] = 1;
                }
            }
            if (startRow == endRow){
                for(j = startRow; j <= endRow; j++){
                    board[i][j] = 1;
                }
            }


}

public static void main(String args[]) {
    // You may leave this empty
    BattleshipBoard b = new BattleshipBoard(10, 10);
    b.placeShip(0, 0, 3, 0);
}
public void placeShip(int startCol、int startRow、int endCol、int endRow)
抛出异常{
如果(startCol>numCols){
抛出新异常(“0”);
}
如果(startCol<0){
抛出新异常(“超出范围,小于1(startCol)”;
}
如果(startRow>numRows){
抛出新异常(“超出范围,大于numRows”);
}
如果(startRow<0){
抛出新异常(“超出范围,小于1(startRow)”;
}
如果((startCol!=endCol)&&(startRow!=endRow)){
抛出新异常(“Diag”);
}
如果(板[i][j]==1){
抛出新异常(“重叠”);
}
if(startCol==endCol){

对于(i=startCol;i您没有处理placeShip可以抛出的异常。您应该将placeShip调用放在try块中

try{
b.placeShip(0, 0, 3, 0);
}
catch(Exception x){
// take some action
}

这样,如果placeShip抛出异常,您的程序不仅会崩溃。

您没有处理placeShip可能抛出的异常。您应该将placeShip调用放在try块中

try{
b.placeShip(0, 0, 3, 0);
}
catch(Exception x){
// take some action
}

这样,如果placeShip抛出异常,您的程序不会崩溃。

Java已检查异常。请执行以下操作:

try {
 b.placeShip(0, 0, 3, 0);
} catch(Exception e) {
System.err.println("error: "+e.getMessage());
}

但是,使用
异常
不是一个好主意。最好创建自己的异常,以扩展
异常
,这样您可以相应地处理不同的规则冲突。

Java已检查异常。请执行以下操作:

try {
 b.placeShip(0, 0, 3, 0);
} catch(Exception e) {
System.err.println("error: "+e.getMessage());
}
但是,使用
异常
不是一个好主意。最好创建自己的异常,以扩展
异常
,这样您可以相应地处理不同的规则冲突。

因此,您有两个选项

  • 声明main(..)方法以引发异常或
  • 用try-catch搜索b.placeShip(…)
  • 所以,你有两个选择

  • 声明main(..)方法以引发异常或
  • 用try-catch搜索b.placeShip(…)

  • 为什么要用这些做循环

            if (startCol == endCol){
                for (i = startCol; i <= endCol; i++ ){
                    board[i][j] = 1;
                }
            }
            if (startRow == endRow){
                for(j = startRow; j <= endRow; j++){
                    board[i][j] = 1;
                }
            }
    

    我还怀疑您在这部分代码中遇到了“索引数组越界异常”。

    为什么循环需要这些异常

            if (startCol == endCol){
                for (i = startCol; i <= endCol; i++ ){
                    board[i][j] = 1;
                }
            }
            if (startRow == endRow){
                for(j = startRow; j <= endRow; j++){
                    board[i][j] = 1;
                }
            }
    

    我还怀疑您在这部分代码中遇到了“索引数组越界异常”。

    请发布“main”方法代码。请发布“main”方法代码。我使用for循环,因为如果说某人有一艘战舰n个空格长。那么循环将穿过并标记该战舰所在的每个位置为1,在磁贴上表示该战舰。其中0为零,3为命中战舰。@Jeff Andrews:它没有像您预期的那样工作。因为循环仅在startCol==endCol时执行,所以n它们只执行一次,因为它们是循环“空间”的末端.@Tudor我这样设计是因为你不能对角放置战列舰。所以这段代码是为了确保战列舰是垂直的还是水平的。我的问题是startCol/startRow比endCol/endRow大,所以我应该做I——而不是I++?问题是你的循环没有用。你从一个值X开始,然后转到一个值Y,但只有当X==Y时才执行循环。你能看到这里发生了什么吗?啊,我明白你在那里说的。如果startCol==endCol,那么飞船显然是垂直的,所以我需要在循环中使用startRow和endRow?我使用for循环,因为如果说有人有一艘战舰n个空格长。那么循环将通过和m将船所在的每个点标记为1,在磁贴上表示那里的船。其中0为零,3为命中船。@杰夫·安德鲁斯:这并不像你所期望的那样工作。因为循环只在startCol==endCol时执行,所以它们只执行一次,因为它们是循环“空格”的末端.@Tudor我这样设计是因为你不能对角放置战列舰。所以这段代码是为了确保战列舰是垂直的还是水平的。我的问题是startCol/startRow比endCol/endRow大,所以我应该做I——而不是I++?问题是你的循环没有用。你从一个值X开始,然后转到一个值Y,但只有在X==Y时才执行循环。你能看到这里发生了什么吗?啊,我知道你在那里说的是什么。如果startCol==endCol,那么飞船显然是垂直的,所以我需要在循环中使用startRow和endRow?我不能只是在方法调用周围放一个try-catch块。将要检查我代码的人正在使用自动驱动程序,所以我需要弄清楚我为什么会遇到这个异常以及将来如何避免它。然后在方法调用周围放置try-catch,看看会发生什么。例如,抛出哪个异常。我不能只是在方法调用周围放置try-catch块。将审查我代码的人正在使用自动驱动程序,所以我需要为了弄清楚我为什么会遇到这个异常,以及将来如何避免它。然后在方法调用周围放置try-catch,看看会发生什么。例如,抛出哪个异常。