【问题标题】:Java String.charAt() not working properlyJava String.charAt() 无法正常工作
【发布时间】:2012-09-13 01:20:14
【问题描述】:

我正在尝试从文本文件中读取网格以构建图表。

目标节点用X 表示,而其他节点用. 表示。

我也有行数和列数。所以,我基本上只是试图读取每一行的下一行,然后通过传递列位置的迭代器来获取每个列位置的字符,并对照X 检查它是否应该被标记为目标节点。

goalGraph = new int[rows][cols];
for (int i = 0; i < rows; i++) {
    String readLine = in.nextLine();
    System.out.println(readLine);
    for (int ii = 0; ii < cols; ii++) {
        char c = readLine.charAt(ii);
        if (c == 'x') {
            goalGraph[i][ii] = 1;
        }
        else {
            goalGraph[i][ii] = 0;
            System.out.print(".");
        }
    }
}

但我在index (0) 处不断收到arrayoutofbounds 错误。

还有一个奇怪的地方是,实现低层代码的时候,并没有打印readLine,而是把它拿出来变成这样:

goalGraph = new int[rows][cols];
for (int i = 0; i < rows; i++) {
    String readLine = in.nextLine();
    System.out.println(readLine);
    /**
    for (int ii = 0; ii < cols; ii++) {
        char c = readLine.charAt(ii);
        if (c == 'x') {
            goalGraph[i][ii] = 1;
        }
        else {
            goalGraph[i][ii] = 0;
            System.out.print(".");
        }
    }
    **/
}

结果,正在读取的行被打印出来,我得到了正确的字符串:

X.....

...X..

......

.X....

谁能指出我正确的方向?

谢谢!

【问题讨论】:

  • 你能告诉我们你在文本文件中读取的grid吗?
  • 它看起来像“X....”等...我在帖子中没有行之间的间隙。我不知道为什么它不让我做多行,所以我不得不按两次“输入”。
  • 这对我来说没有任何意义,因为如果我像第二个代码示例中那样删除整个 char 块,打印语句开始工作并显示该行确实被正确读取。然而,被注释掉的块在 print 语句的下方,所以我不知道为什么当代码没有被注释掉时,至少第一个 print 语句甚至不起作用。

标签: java string char


【解决方案1】:

您显示的代码没有明显错误。我们需要看到更多。可能正在发生的事情是您的输入中实际上没有rows 行数据。 rowscols 是如何生成的? in是什么类型,如何初始化? arrayoutofbounds 错误发生在哪一行?

【讨论】:

  • 由于某种原因,我似乎无法插入换行符,所以我为这个块道歉。在进入此操作之前,我正在打印“rows”和“cols”,并且它们被正确读取,因此在这种情况下,rows = 5 和 cols = 6。它们是通过读取文本文件中的前两个整数值生成的. 'in' 是扫描仪文件的初始化方式: Scanner in = new Scanner(new File(fileName));实际上没有指定任何行,它只是说“java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0”
  • 如上所述,它没有任何意义,因为当我注释掉所有字符操作等时,我打印'readLine'的行,从文本文件中读取的行,它确实有效,并表明它正在被正确读取。为什么第一个打印操作下面的代码会受到后面的影响?它是否应该在所有角色恶作剧开始发挥作用之前至少打印一次 read in line?
  • @user1667270:您应该真正获得异常的完整堆栈跟踪 - 它甚至可能不会在您认为的代码中生成。如果您在命令行上运行,它应该只打印它。如果它是 GUI,则可能有一个日志文件,您可以从中获取完整的堆栈跟踪信息。
  • @user1667270:如果您的输出被缓冲,随后的错误可能会导致之前的prints 永远无法到达终端。尝试将System.out.flush() 放在prints 之后(这不太可能修复它,因为默认情况下已经刷新了 - 但如果您的堆栈跟踪没有被打印,那么您的 I/O 配置有些奇怪)。跨度>
猜你喜欢
  • 2017-02-17
  • 2017-03-30
  • 2015-02-20
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2011-08-26
相关资源
最近更新 更多