浏览一个txt文件并查找带有异常的整数和

时间:2018-02-04 23:16:52

标签: java exception

我有一个程序,假设询问用户什么是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)

3 个答案:

答案 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));