我正在编写一个程序来读取文件,然后检查是否有相同数量的关闭和打开括号。因此我所做的是使用FileInputStream和Scanner类来读取文件并将每个字符存储在ArrayList中。如果读取的文件没有以块注释结束,那么我的程序大部分时间都可以工作。以下是我的代码。
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上的第一个问题。非常感谢你。
答案 0 :(得分:1)
您的支票不正确:
if ((fileText.get(i) == '/') && (fileText.get(i+1) == '/') && ((i+1)<fileText.size())) {
并非完全缺少检查,但是从左到右评估条件,因此在执行检查正确长度之前,您对 将其更改为:fileText.get(i+1)
的访问是。< / p>
if ((fileText.get(i) == '/') && ((i+1)<fileText.size() && fileText.get(i+1) == '/')) {
答案 1 :(得分:0)
在你的条件下,你在许多地方检查(i + 1),(i + 2),在那里我可以到达fileText.size() - 1。这将导致outofBound数组异常。
if ((fileText.get(i) == '/') && (fileText.get(i+1) == '*') && (i+1 < fileText.size())) blockComment = true;
答案 2 :(得分:0)
这很简单。您尝试访问金额中的字段。你的最后一个字符就像'/',但你试图访问另一个不可用的字符。请参阅下面的代码行
//Case lineComment
if ((fileText.get(i) == '/') && (fileText.get(i+1) == '/') && ((i+1)<fileText.size())) {
lineComment = true;
}
假设i = fileText.size() - 1,以及
时会发生什么fileText.get(i) // nothing all is fine
fileText.get(i+1) // ??? occur exception IndexOutOfBound