Java 遍历一个txt文件并查找整数和(异常)
我有一个程序,它可以询问用户什么是txt文件,遍历txt文件,找到所有可解析的整数并求平均值。我有下面的代码,但它给了我一大堆错误。所有这些错误的原因是什么 txt文件是: 5. 15 312 16 8744 捌万伍仟零陆拾贰元壹角398分 九十三Java 遍历一个txt文件并查找整数和(异常),java,exception,Java,Exception,我有一个程序,它可以询问用户什么是txt文件,遍历txt文件,找到所有可解析的整数并求平均值。我有下面的代码,但它给了我一大堆错误。所有这些错误的原因是什么 txt文件是: 5. 15 312 16 8744 捌万伍仟零陆拾贰元壹角398分 九十三 如果查看JavaDoc的,您会发现它“构造了一个新的扫描器,生成从指定字符串扫描的值。”您需要的是“…一个新的扫描器,生成从指定文件扫描的值” 不要使用Do while,如果文件没有任何整数,它将通过空指针。用while代替。另外,不要初始化循环中的
如果查看JavaDoc的,您会发现它“构造了一个新的扫描器,生成从指定字符串扫描的值。”您需要的是“…一个新的扫描器,生成从指定文件扫描的值” 不要使用Do while,如果文件没有任何整数,它将通过空指针。用while代替。另外,不要初始化循环中的任何变量。这将导致它们在每次迭代时重新初始化
file.nextInt()的要点是什么代码>在您的catch块中?它使程序跳过一个额外的整数。移除它。此外,不要调用input.close()在
中,您不想关闭系统
@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程序员指出的,“八七”和“八万五千六百二十二”不是数字,因此Scanner\nextInt
将不包括它们。一个解决方法是相应地使用和解析。类似这样的情况:您的代码完全错了。我已经修改过了,现在可以用了
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));
}
}
扫描仪文件=新扫描仪(文件名)
线程“main”java.util.NoSuchElementException中出现异常
如果使用扫描仪从文本文件读取数据,则需要指定文件,而不是字符串,这就是出现上述错误的原因
使用:
然后递归地遍历文本文件,如下所示:
while(scanner.hasNext())
您的代码:
while(file.hasNextInt())
将不起作用,因为当遇到除整数以外的任何内容时,hasNextInt()方法将停止处理文本文件
System.out.println(“无法将“+num+”解析为整数。”)
变量num是在处理异常的主体的不同范围内定义的。由于NumberFormatException主体中未定义num,将引发其他错误
txt文件是:5153216168744850000622 139893
如果文本文件中的项目在同一行上,最好使用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));
eight
不是int
,因此file.nextInt()
将fail@MadProgrammer我认为NumberFormatException会控制它。java.util.NoSuchElementException
不是从NumberFormatException
或任何公共祖先扩展而来,所以我也不会理解它,扫描仪文件=新扫描仪(文件名)
不正确,这是将字符串
文件名
传递给要处理的扫描仪
,而您可能指的是扫描仪文件=新扫描仪(新文件(文件名))代码>它将实际读取指定的文件我可以看出您是新的。这里让我给你一些建议。永远不要把密码交给别人。相反,解释他们犯了什么错误,为什么是错误(如果可以的话),以及你到底是如何纠正的。明白了。谢谢你的建议。他密码里的每一件事都是错的,所以我想帮助他。下次仍将记住它。“…hasNextInt()方法在遇到除整数以外的任何内容时将停止处理文本文件。”事实并非如此。如果输入系统中还有任何整数,它将返回true。您应该正确引用。“Lord Why”包含了来自OPs代码的,而他是对的,如果下一个标记不是int
,它将停止处理/循环。但是你的句子“如果输入中还有整数,它将返回true”是错误的。该方法检查下一个标记,而不是输入流上留下的任何标记。实际上,不,只有当输入流中的下一组字符可以读取为int类型时,它才会返回true。根据官方Javadoc,“如果可以使用nextInt()方法将此扫描仪输入中的下一个标记解释为默认基数中的int值,则返回true。”
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));