以下是我正在使用的代码的一小部分,以及我正在使用的文本文件的语法。 (我相当确定两者都非常复杂,但我不确定如何简化它们。)
while((line = bufferedReader.readLine()) != null)
{
if(line.split("@@")[0].equals(lineNumber))
{
numberOfLines = Integer.parseInt(line.split("@@")[1]);
spaceSkip = 1;
worked = 0;
}
if(spaceSkip == 0)
{
if(numberOfLines > 0)
{
System.out.println(line);
numberOfLines--;
}
}
spaceSkip = 0;
}
文本文件的格式为: 1 @@ 2 @@ 3 @@ 0 文字低于它, 并且可以跨越多条线。
3和0在这里没有发挥作用。目的是让程序搜索所选的数字并将其与第一个数字匹配,在这种情况下为1。第二个数字是要读取的行数。在代码中,我有" spaceSkip"所以它不会读取索引行。
除了解释之外,我遇到的问题是line.split("@@")[0].equals(lineNumber)
似乎在读错。我同时打印到屏幕上,两者都等于1,但它仍然返回我包含的错误消息。 (" working = 0;"是阻止错误触发的原因。)我确信这是我在这里犯的一个愚蠢的错误,但我仍然无法弄明白。提前谢谢。
答案 0 :(得分:2)
每当比较没有返回您认为应该的内容时,请检查类型是否符合您的想法。
String#split返回一个字符串数组。对于您的给定输入,该数组的第一个元素将是" 1"。如果lineNumber不是String,比如说int,那么equals仍然可以工作(原始int被自动装箱到java.lang.Integer,这是java.lang.Object的子类,它是equals方法的类型作为参数),但比较("1".equals(1)
)将始终返回false。 JavaScript可以将字符串和int等同("1" == 1
返回true),但Java不是。
最简单的解决方法是将lineNumber转换为String,方法是调用在行号中传递的String#valueOf。最好将lineNumber转换为String而不是尝试将split输出转换为Integer,因为Integer解析可能会因输入错误而失败,而且我宁愿避免管理这种可能性。
拆分调用的剪切是不幸的,主要是因为冗余,你应该将一次拆分成一个局部变量,如:
String[] parts = line.split("@@");
if (parts[0].equals("1")) {
numberOfLines = Integer.parseInt(parts[1]);
...
答案 1 :(得分:0)
如果没有看到变量的初始化,很难说,但是你可能在这个if语句中将String与Integer进行比较。 您可能希望尝试将第二个参数转换为String,如下所示。
if(line.split("@@")[0].equals(String.valueOf(lineNumber)))