Java 从文件读取的行生成子字符串
因此,我试图读取一个.txt文件,找到html标记的所有实例,将开始标记推到堆栈中,然后在找到结束标记时将其弹出。现在,我得到以下行的字符串越界异常:Java 从文件读取的行生成子字符串,java,string,substring,Java,String,Substring,因此,我试图读取一个.txt文件,找到html标记的所有实例,将开始标记推到堆栈中,然后在找到结束标记时将其弹出。现在,我得到以下行的字符串越界异常: if(scan.next().startsWith("</", 1)) { toCompare = scan.next().substring(scan.next().indexOf('<'+2), scan.next().indexOf('>'));
if(scan.next().startsWith("</", 1))
{
toCompare = scan.next().substring(scan.next().indexOf('<'+2), scan.next().indexOf('>'));
tempString = htmlTag.pop();
if(!tempString.equals(toCompare))
{
isBalanced = false;
}
}
else if(scan.next().startsWith("<"))
{
tempString = scan.next().substring(scan.next().indexOf('<'+1), scan.next().indexOf('>'));
htmlTag.push(tempString);
}
那么我的比较呢?您的代码中有两个主要问题:
- 您调用的
太多了,正如您所料,这会将扫描仪移动到下一个令牌。因此,最后一个将丢失并消失scan.next()
.indexOf('Remove
operator。如果您已经修复了@Pshemo告诉您的内容,那么不要奇怪else
将始终是一个空字符串。str.substring(str.indexOf('')
str.indexOf('当然所有的
调用正在转移到下一个字符串。这就是为什么将该方法命名为next,以获取下一个令牌。感谢所有人的帮助。我昨晚最终修复了它。我刚刚制作了tempString=scan.next(),并用它进行了所有计算。scan.next()
toCompare = scan.next()
public String extract(final String str) { if (str.startsWith("</")) { return extract(str, 2); } else if (str.startsWith("<")) { return extract(str, 1); } return str; } private String extract(final String str, final int offset) { return str.substring(str.indexOf('<') + offset, str.lastIndexOf('>')); }
final String token = scan.next(); if (token.startsWith("</")) { // removed the second argument final String currentTag = extract(token); // renamed variable final String lastTag = htmlTag.pop(); // introduced a new temporary variable if (!lastTag.equals(currentTag)) { isBalanced = false; } } else if (token.startsWith("<")) { htmlTag.push(extract(token)); // no need for a variable here }