数组越界异常? (致力于康威的生命游戏)

时间:2014-10-17 17:54:54

标签: java arrays conways-game-of-life

所以我大约在我的第一个java课程的中途...所以你可能需要把它分解为我的小步骤,我道歉!

我现在正致力于康威的生活游戏。幸运的是我们没有使用gui(...呢?)但是我仍然坚持简单地设置网格。 我的代码编译正常,但是当我运行时,我得到: 错误:无法找到或加载主类gameOfLife 所以,我更多地研究了它,似乎问题出在我的网格文件中,它给出了同样的错误: 错误:找不到或加载主类Grid

编辑**:这就是我运行它们的方式

[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

谢谢你们!

2 个答案:

答案 0 :(得分:2)

如果您的班级在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 Naming Conventions


您还有其他一些问题:

  1. 您使用的是错误的变量名称。使用比cupcakemuffin更好的名称,这些名称实际上意味着变量是什么。例如使用nextLine代替cupcakelineChars代替muffin
  2. 您正在尝试解析空行。解决这个问题的最简单方法是添加此循环以跳过空行:
  3. 代码:

    String cupcake = reader.nextLine();
    while(cupcake.isEmpty()) cupcake = reader.nextLine();
    
    1. 您的循环中已交换xy。循环的工作方式,y应该是第一个数字,x应该是第二个数字,例如
    2. 代码:

      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
      

答案 1 :(得分:0)

在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行,Exception发生在第20行。这可能是由于代码中用于计算邻居的条件越界,但我们需要其余的代码才能解决这个问题。请相应地进行编辑。