gpt4 book ai didi

从文件读取注释时,Java ArrayList IndexOutOfBound

转载 作者:行者123 更新时间:2023-12-01 08:53:58 26 4
gpt4 key购买 nike

我正在编写一个程序,该程序读取文件,然后检查是否有相同数量的右括号和左括号。因此,我所做的是使用 FileInputStream 和 Scanner 类来读取文件并将每个字符存储在 ArrayList 中。如果读取的文件不以 block 注释结束,我的程序在大多数情况下都可以工作。下面是我的代码。

private Input input;
private ArrayList<Character> fileText;

public q1_19() {
input = new Input();
fileText = new ArrayList<Character>();
}

private void storeTextInArray(String name) {
FileInput readFile = new FileInput(name); //Makes use of Scanner and FileInputStream

while(readFile.hasNextChar()) {
fileText.add(readFile.nextChar());
}
readFile.close();
}

private boolean booleanChecker() {
int braces = 0;

boolean lineComment = false;
boolean blockComment = false;
boolean constant = false;
boolean string = false;

for (int i = 0; i < fileText.size(); i ++) {

//Case lineComment
if ((fileText.get(i) == '/') && (fileText.get(i+1) == '/') && ((i+1)<fileText.size())) {
lineComment = true;
}

if ((lineComment) && (fileText.get(i) == '\n')) {
lineComment = false;
}

//Case constant
if ((fileText.get(i) == '\'') && (fileText.get(i+2) == '\'') && ((i+2)<fileText.size())) {
constant = true;
i++;
}

//End String
if ((string) && (fileText.get(i) == '"')) {
string = false;
}

//End blockComment
if ((blockComment) && (fileText.get(i) == '*') && (fileText.get(i+1) == '/') && (i+1 < fileText.size())) {
blockComment = false;
if (fileText.lastIndexOf(fileText) == i) {
break;
}
}

if (!(lineComment || blockComment || constant || string)) {
//String constant
if (fileText.get(i) == '"') string = true;

if ((fileText.get(i) == '/') && (fileText.get(i+1) == '*') && (i+1 < fileText.size())) blockComment = true;

if (!(lineComment || blockComment || constant || string)) {
if (fileText.get(i) == '{') { braces ++; System.out.println("+1"); }
if (fileText.get(i) == '}') { braces --; System.out.println("-1"); }
}
}

constant = false;
}
System.out.println(braces);
if (braces != 0) return false;
else return true;
}

例如,当我尝试阅读时 {{}}
/**/
,我得到的错误是 java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)

这并不是一个真正的问题,因为我可以读取大多数文件,但我只是想了解为什么。如果我问错了问题,请原谅我,因为这是我在 StackFlow 上的第一个问题。非常感谢。

最佳答案

您的支票不正确:

if ((fileText.get(i) == '/') && (fileText.get(i+1) == '/') && ((i+1)<fileText.size())) {

并不是说检查完全缺失,而是条件是从左到右评估的,因此您对 fileText.get(i+1) 的访问发生在之前执行正确长度的检查。

将其更改为:

if ((fileText.get(i) == '/') && ((i+1)<fileText.size() && fileText.get(i+1) == '/')) {

关于从文件读取注释时,Java ArrayList IndexOutOfBound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42181813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com