编辑:安装简单修复程序并检查空白行。我还没有完全理解I / O以及read.line()的工作原理。
最终代码:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class MagicSquareAnalysis {
public static boolean testMagic(String pathName) throws IOException {
// Open the file
BufferedReader reader = new BufferedReader(new FileReader(pathName));
boolean isMagic = true;
int lastSum = -1;
// For each line in the file ...
String line;
while ((line = reader.readLine()) != null) {
// ... sum each row of numbers
String[] parts = line.split("\t");
int sum = 0;
for (String part : parts) {
if (line.isEmpty()) {
continue;
} else {
sum += Integer.parseInt(part);
}
}
if (lastSum == -1) {
// If this is the first row, remember the sum
lastSum = sum;
} else if (lastSum != sum) {
// if the sums don't match, it isn't magic, so stop reading
isMagic = false;
break;
}
}
reader.close();
return isMagic;
}
public static void main(String[] args) throws IOException {
String[] fileNames = { "C:\\Users\\Owner\\workspace\\MagicSquares\\src\\Mercury.txt", "C:\\Users\\Owner\\workspace\\MagicSquares\\src\\Luna.txt" };
for (String fileName : fileNames) {
System.out.println(fileName + " is magic? " + testMagic(fileName));
}
}
}
原始问题
拥有一个读取.txt数字文件的Java程序。文本文件具有由选项卡间隔开的多行数字。我的程序第22行继续收到错误,这是代码:
sum += Integer.parseInt(part);
在几个语句检查程序的进度后,我发现错误是在程序分析第一行后发生的。由于某种原因,它一直试图读取的输入是空白行中的“”。 read.line()似乎没有像使用while语句那样跳过空白行。
为什么程序没有跳过空白行并尝试阅读它的任何想法?
答案 0 :(得分:1)
因为split
,根据文档,将返回一个包含单个元素的数组,该数组是一个空字符串。
readline()
正在从行中删除\n
(或\r\n
窗口),返回一个空字符串。
当你这样做时:
String[] parts = line.split("\t");
对空字符串执行正则表达式时,有一个空的前导字符串,导致parts[0]
为""
您可以通过简单的测试看到这一点:
public static void main( String[] args )
{
String foo = "";
System.out.println("String length: " + foo.length());
String[] parts = foo.split("\t");
System.out.println("Array Length: " + parts.length);
System.out.println("Length of that one String in the array: " + parts[0].length());
}
输出:
字符串长度:0
阵列长度:1
数组中一个字符串的长度:0
至少你需要检查那个空字符串:
for (String part : parts) {
if (!part.isEmpty()) {
sum += Integer.parseInt(part);
}
}
答案 1 :(得分:0)
你可以试试这个:
while ((line = reader.readLine()) != null) {
if ( line.trim().length() == 0)
continue;
//Your other code
}
答案 2 :(得分:0)
字符串""
与null
不同,请查看此链接以获取更多信息。 Difference between null and empty ("") Java String
同样readline()
仅在达到EOF(文件结尾)时返回null。
在执行split("\t")
时,您可能会""
更好地检查字符串中的“”,然后再将其解析为数字。
for (String part : parts) {
if(!part.isEmpty()){
//your code
}}