我有一个程序,假设询问用户什么是txt文件,浏览txt文件并查找所有可解析的int并对它们进行平均。我在下面有以下代码,但它给了我一堆错误。造成这些错误的原因是什么?
txt文件是: 五 15 312 16 八七44 八十五万六十二十九98 93
import java.util.Scanner;
public class Ch12Pt2 {
public static void main(String[] args) throws NumberFormatException {
Scanner input = new Scanner(System.in);
System.out.print("Enter filename: ");
String filename = input.nextLine();
Scanner file = new Scanner(filename);
if(file.nextLine().equals(""))
{
System.err.println("Could not find file:" + filename);
System.exit(1);
}
do {
try {
int total = 0;
int count = 0;
int num = file.nextInt();
total = num + total;
//Display the results
System.out.println("The number of parsable numbers: " + count);
System.out.println("Average values: " + (total / count));
}
catch (NumberFormatException ex) {
System.out.println("Cannot parse " + num + " as an integer.");
file.nextInt();
}
} while (file.hasNextInt());
// Close the files
input.close();
file.close();
}
}
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Ch12Pt2.main(Ch12Pt2.java:21)
答案 0 :(得分:1)
如果您查看constructor you used的JavaDoc,您将会“构造一个新的Scanner,它会生成从指定字符串扫描的值。”你想要的是Scanner#Scanner(File source)
,“......一个新的扫描仪,它产生从指定文件扫描的值”。
不要使用do-while,如果你的文件没有任何整数,它将通过空指针。请改用。另外,不要在循环内初始化任何变量。这将导致它们在迭代时重新初始化。
你的catch区块file.nextInt();
有什么意义?它会导致程序跳过一个额外的整数。去掉它。此外,请勿致电input.close();
,您不想关闭System.in
。
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.println("Enter filename: ");
File file = new File(input.nextLine());
/*
* Check file existence before constructing your scanner. This will prevent a
* FileNotFoundException. Notice, I used File#exists and the NOT operator '!'
*/
if (!file.exists()) {
System.err.println("Could not find file: " + file.getName());
System.exit(0);
}
Scanner scanner = new Scanner(file);
// Initialize variables outside of loop.
int num = 0;
int total = 0;
int count = 1;
// No do-while
while (scanner.hasNextInt()) {
try {
num = scanner.nextInt();
total += num;
// Display the results
System.out.println("The number of parsable numbers: " + count);
System.out.println("Average values: " + (total / count));
// count is pointless unless you increase it after every number.
count++;
} catch (NumberFormatException ex) {
System.out.println("Cannot parse " + num + " as an integer.");
}
}
// Close the files
scanner.close();
最后,正如Mad Programmer所指出的那样,“八七”和“八十五六十二”不是数字,因此Scanner#nextInt
将不包括它们。解决方法是使用Scanner#nextLine
并进行相应的解析。这样的事情:How to convert words to a number?
答案 1 :(得分:-1)
你的代码完全错了。我现在已经重新设计了它。
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class Ch12Pt2 {
public static void main(String[] args) throws NumberFormatException, FileNotFoundException {
Scanner input = new Scanner(System.in);
System.out.print("Enter filename: ");
String filename = input.nextLine();
Scanner file = new Scanner(new FileReader(filename));
int num =0;
int count =0;
int total =0;
if(file.nextLine().equals(""))
{
System.err.println("Could not find file:" + filename);
System.exit(1);
}
while (file.hasNextInt()){
try {
num = file.nextInt();
total = num + total;
count++;
}
catch (NumberFormatException ex) {
System.out.println("Cannot parse " + num + " as an integer.");
}
}
// Close the files
input.close();
file.close();
System.out.println("The number of parsable numbers: " + count);
System.out.println("Average values: " + (total / count));
}
}
答案 2 :(得分:-1)
扫描仪文件=新的扫描仪(文件名);
线程“main”中的异常java.util.NoSuchElementException
如果您使用扫描仪从文本文件中读取数据,则需要指定文件,而不是字符串,这就是您收到上述错误的原因。
使用:
Scanner scanner = new Scanner(new FileReader("foo.txt"));
然后以递归方式遍历文本文件:
while(scanner.hasNext())
您的代码:
while(file.hasNextInt());
无效,因为hasNextInt()方法在遇到整数以外的任何内容时都会停止处理文本文件。
System.out.println(“无法解析”+ num +“作为整数。”);
变量num在与处理异常的主体不同的范围内定义。将抛出另一个错误,因为未在NumberFormatException体中定义num。
txt文件是:5 15 312 16八七44八十五六十二13 98 93
如果文本文件中的项目在同一行,最好使用split方法获取所有元素,然后检测它们是否为数字。
String line = sc.nextLine();
String elements = line.split(" ");
for (String e : elements) {
// add if int, or continue iteration
}
否则,请尝试以下方式:
int sum = 0;
int numElements = 0;
Scanner scanner = new Scanner(new FileReader("path-to-file"));
while (scanner.hasNext()) {
try {
int temp = Integer.parseInt(sc.nextLine());
sum += temp;
numElements += 1;
}catch(NumberFormatException e) {
continue;
}
}
System.out.println("Mean: "+ (sum/numElements));