0

所以我得到那个字符串索引超出范围意味着我超出了集合的范围,但我不太确定我是如何用我的代码做到这一点的。

此代码应该从包含 3 个整数的文本文件中读取(前两个与此相关,分别为行数和列数),然后是一系列字符。因此,它首先读取并保存前三个数字,然后将文件的其余部分转换为字符串。然后,它通过使用文本文件的尺寸设置一个字符数组,然后用文本文件的字符一个字符一个字符地填充这些值。

但是,当我尝试打印代码时,遇到字符串索引超出范围错误,无法找到问题所在。

这是代码:

  import java.util.*;  
  import java.io.*;

public class SnakeBox {
// instance variables
  private char[][] box;
  private int snakeCount;
  private int startRow, startCol;
  private int endRow, endCol;
    private int rows, cols, snakes;
  Scanner keyboard = new Scanner(System.in);

/** Create and initialize a SnakeBox by reading a file.
    @param filename the external name of a plain text file
*/
  public SnakeBox(String fileName) throws IOException{
     Scanner infile = new Scanner(new FileReader(fileName));


     int count = 0;
     String s = "";
     rows = infile.nextInt();
     cols = infile.nextInt();
     snakes = infile.nextInt();
        infile.nextLine();
     box = new char[rows][cols];
     while (infile.hasNext()) {
        s += infile.next();
     }
     for (int i = 0; i < rows; i++) {

        for (int j = 0; j < cols; j++) {
           count++;
           char c = s.charAt(count);           
           box [i][j] = c;
        }
     }
  } 

文本文件是:

    16 21 4
+++++++++++++++++++++
+                   +
+         SSSSS     +
+    S   S          +
+    S    SS        +
+    S      S       +
+ S  S       SS     +
+  SS  S            +
+     S             +
+    S  SSSSSS      +
+   S         S     +
+  S           S    +
+ S     SSS   S     +
+      S     S      +
+       SSSSS       +
+++++++++++++++++++++

谢谢你。

4

2 回答 2

6

改变

count++;
char c = s.charAt(count);  

char c = s.charAt(count);   
count++;

编辑:另一个问题是 Scanner.next() 返回下一个令牌,忽略所有空格。查看 Achintya Jha 的答案

于 2013-04-05T09:05:35.807 回答
2

问题不是上面所说的:在给定的文件中有将近 59 个标记,总共等于 117 个字符(我手动计算)。而count的最大值将达到21*16 =336。

如果名为“infile.dat”的输入文件具有以下格式:

你好那里 1234
CSstudents 再见 6556

它有六个标记,我们可以使用以下代码读取它们:

while (filein.hasNext()) {      // while there is another token to read
    String s = filein.next();   // reads in the String tokens "Hello" "CSstudents" 
    String r = filein.next();   // reads in the String tokens "There" "goodbye"
    int x = filein.nextInt();   // reads in the int tokens 1234  6556 

}

请注意 Scanner 对象如何跳过所有空白字符到下一个标记的开头。所以我的建议是使用Scanner#hasNextLine() & Scanner#nextLine()

while (infile.hasNextLine) {
    s += infile.nextLine();
}
于 2013-04-05T09:19:03.697 回答