簡體   English   中英

數組越界異常? (致力於康威的生活游戲)

[英]Array out of bounds exception? (Working on conway's game of life)

因此,我即將完成我的第一個Java課的一半。因此,對於我來說,您可能需要將其分解為一些基本步驟!

我現在正在研究Conway的生活游戲。 幸運的是我們還沒有使用gui(...?),但是我仍然堅持只設置網格。 我的代碼可以很好地編譯,但是當我運行時我得到:錯誤:無法找到或加載主類gameOfLife因此,我對其進行了更多研究,似乎問題出在我的網格文件中,它給出了相同的錯誤:錯誤:找不到或加載主類網格

編輯**:這就是我運行它們的方式

[bgorgero@sraysvcs2 gameOfLife]$ java gameOfLife
Error: Could not find or load main class gameOfLife
[bgorgero@sraysvcs2 gameOfLife]$ java Grid
Error: Could not find or load main class Grid

編輯*:

[bgorgero@sraysvcs2 ~]$ java gameOfLife/gameOfLife
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at gameOfLife.gameOfLife.main(gameOfLife.java:20)

這是我嘗試訪問它而不進入文件夾時遇到的錯誤。

我正在嘗試從輸入的txt文件中讀取網格,以找出數組應該有多大,然后讀取0和1並將其存儲到數組中。 到目前為止,這是我的代碼

gameOfLife.java

package gameOfLife;
import java.util.Scanner;
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;

public class gameOfLife{
    public static void main (String[] args) throws Exception {
       File input = new File("gameBoardInput.txt");
        Scanner reader = new Scanner(input);
        int x = reader.nextInt();
        int y = reader.nextInt();

        Grid grid = new Grid(x,y);

        for(int i = 0; i < x; i++){
            String cupcake = reader.nextLine();
            char[] muffin = cupcake.toCharArray();
            for(int j = 0; j < y; j++){
                grid.setAt(i,j,muffin[j]);
                }
            }

    }
}

Grid.java

package gameOfLife;
public class Grid{
    protected int[][] grid;

        public Grid (int x, int y){
           grid = new int[x][y];
            for (int i = 0; i < x; i++){
            for (int j = 0; j < y; j++){
                grid[i][j] = 0;
            }
        }
    }

        public int nuggets (int x, int y){
        return grid[x][y];
        }

        public void setAt(int column, int row, int alive){
        grid[column][row] = alive;
        }


}

我的gameBoardInput.txt很簡單:

5
6
01000
00100
00010
01110
00100
00000

感謝大伙們!

如果您的班級在package gameOfLife; 您需要將類放在名為gameOfLife的目錄中

然后,使用以下命令運行它:

$ java gameOfLife/gameOfLife

根據您提供的代碼,確保gameBoardInput.txt位於同一目錄中。 我讓它在計算機上以其他錯誤運行:

$ ls . gameOfLife/
.:
gameBoardInput.txt  gameOfLife

gameOfLife/:
gameOfLife.class  Grid.class

$ java gameOfLife/gameOfLife
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at gameOfLife.gameOfLife.main(gameOfLife.java:20)

順便說一句,您永遠不要用小寫字母命名類。 我建議為該類推薦GameOfLife 在此處閱讀更多信息: Java命名約定


您還有其他問題:

  1. 您正在使用錯誤的變量名。 使用比cupcakemuffin更好的名稱,它們實際上意味着變量的含義。 如使用nextLine代替cupcakelineChars而不是muffin
  2. 您正在嘗試解析空行。 最簡單的解決方法是添加此循環以跳過空行:

碼:

String cupcake = reader.nextLine();
while(cupcake.isEmpty()) cupcake = reader.nextLine();
  1. 您在循環中交換了xy 循環的工作方式, y應該是第一個數字, x應該是第二個數字,例如

碼:

int y = reader.nextInt();
int x = reader.nextInt();

這是我的確切代碼:

gameOfLife / gameOfLife.java

package gameOfLife;

import java.util.Scanner;
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;

public class gameOfLife {
    public static void main(String[] args) throws Exception {
        File input = new File("gameBoardInput.txt");
        Scanner reader = new Scanner(input);
        int y = reader.nextInt();
        int x = reader.nextInt();

        Grid grid = new Grid(x, y);

        for (int i = 0; i < x; i++) {
            String cupcake = reader.nextLine();
            while (cupcake.isEmpty())
                cupcake = reader.nextLine();
            char[] muffin = cupcake.toCharArray();
            for (int j = 0; j < y; j++) {
                grid.setAt(i, j, muffin[j]);
            }
        }
    }
}

gameOfLife / Grid.java

package gameOfLife;

public class Grid {
    protected int[][] grid;

    public Grid(int x, int y) {
        grid = new int[x][y];
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                grid[i][j] = 0;
            }
        }
    }

    public int nuggets(int x, int y) {
        return grid[x][y];
    }

    public void setAt(int column, int row, int alive) {
        grid[column][row] = alive;
    }

}

gameBoardInput.txt

5
6
01000
00100
00010
01110
00100
00000

在main方法中使用try-catch塊,不要使其拋出異常。 您的JDK版本是什么? 嘗試類似的方法:

public static void main(String[] args){
    try{
        //insert code here
    }catch(Exception e){e.printStackTrace();}

另外,使用java.util.ArrayList<String>通過其add(<String>)方法存儲輸入文本。 然后使用size()獲得行數,並使用get(0).length()列數

另外,您缺少代碼。 main方法沒有20行,而異常發生在20行。這可能是由於您的代碼中用於計算鄰居的越界條件引起的,但是我們需要其余代碼來解決這一問題。 請進行相應的編輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM