Java input.next() 异常

Java input.next() exception

提问人:JoubasaurusREX 提问时间:7/4/2023 最后编辑:JoubasaurusREX 更新时间:7/4/2023 访问量:83

问:

我有以下代码:

import java.util.Scanner;
import java.io.Serializable;
import java.io.*;

public class Application implements Serializable{

    private static Scanner input;

    public static void openInput()
    {
        try
        {
            input = new Scanner(new File("postings.txt"));
            input.useDelimiter("[,\\n\\r]");
            System.out.println("File opened(message1)");
        }
        catch(IOException ioe)
        {
            System.out.println("File has not opened" + ioe);
            System.exit(1);
        }
        System.out.println("File opened (message 2)");
    }

    public static void closeInput()
    {
        input.close();
        System.out.println();
    }

    public static void application()
    {
        Media[] arr = new Media[25];
        char type;
        String id, author;
        int views, likes, rebeeps, duration, shares;
        int numObjects = 0; 
        while(input.hasNext())
        {
            id = input.next();
            type = id.charAt(1);
            author = input.next();
            views = input.nextInt();
            if (type == 'B')
            {
                rebeeps = input.nextInt();
                likes = input.nextInt();
                arr[numObjects++] = new Beeper(type+id,author,views,rebeeps,likes);
            }
            else if(type == 'D')
            {
                duration = input.nextInt();
                shares = input.nextInt();
                arr[numObjects++] = new DingDong(type+id,author,views,duration,shares);
            }
            else
            {
                System.out.println("Incorrect code: " + arr[numObjects]);
            }
        }

        System.out.println("List of postings");
        for(int i = 0; i <= numObjects; numObjects++)
        {
            System.out.println(arr[numObjects]);
        }

        System.out.println("Scores of postings");
        for(int i = 0; i<= numObjects; numObjects++)
        {
            System.out.printf("%-8%7.2f",arr[numObjects].getID() + arr[numObjects].getAuthor() + arr[numObjects].calculateScore());
        }

        System.out.printf("%-8%7.2f",arr[numObjects].getID() + arr[numObjects].author + arr[numObjects]);

    }

    public static void main(String[] args)
    {
        openInput();
        application();
        closeInput();
    }
}

我有三个类:一个超类和两个子类 超类:媒体 子类:叮咚、蜂鸣器

我正在尝试从文本文件中获取信息,例如: D123456,JohnD,28123,154,8045

并根据其特定类将其保存到数组中,但是当我运行Application时出现以下异常:

File opened(message1)
File opened (message 2)
Incorrect code: null
Exception in thread "main" java.util.InputMismatchException
        at java.base/java.util.Scanner.throwFor(Scanner.java:939)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at Application.application(Application.java:44)
        at Application.main(Application.java:82)

类 Application 代码中的变量与超类和子类中的变量类型相同且正确。 请帮忙!

Java 数组 异常 文件-io java.util.scanner

评论


答:

0赞 WJS 7/4/2023 #1

将输入分隔符更改为

input.useDelimiter("[,\n\r]+");

回车符和换行符有时可以一起使用来表示行尾,因此您需要使用加号来根据需要使用任意数量的字符类。

并更改为因为第一个字符开始于type = id.charAt(1);type = id.charAt(0);0

更新

我相信问题在于,如果您收到无效代码,则没有读取额外的值,因此它们处于混乱状态。执行以下操作可能会有所帮助,但这取决于在找不到类型时是否存在这些额外值。

            if (type == 'B') {
                rebeeps = input.nextInt();
                likes = input.nextInt();
            } else if (type == 'D') {
                duration = input.nextInt();
                shares = input.nextInt();
            } else {
                input.next(); // remove the lasts two values from the line
                input.next();
                System.out.println("Incorrect code:");
            }

另一种解决方案是读取一行,然后使用逗号和/或空格作为分隔符在该行上拆分。在这种情况下,如果输入中有任何错误,则忽略该行。

while (input.hasNextLine()) {
   String line = input.nextLine();
   String[] tokens = line.split("[,\\s]+");
   if (tokens.length != 5) {
      // print error message and take action (continue loop)
      continue;  // continue loop
   }  else {
      id = tokens[0];
      type = id.charAt(0);
      author = tokens[1];
      views = Integer.parseInt(tokens[2]);
    
      if (type == 'B') {
          rebeeps = Integer.parseInt(tokens[3]);
          likes =   Integer.parseInt(tokens[4]);
      } else if (type == 'D') {
          duration = Integer.parseInt(tokens[3]);
          shares = Integer.parseInt(tokens[4]);
      } else {
        System.out.println("Incorrect code:");
      }
}

评论

0赞 JoubasaurusREX 7/4/2023
谢谢!我改变了你说的话,但它仍然给了我同样的例外。
0赞 WJS 7/4/2023
您能否只发布带有一些数据的解析部分,而不是任何对象创建等。即读入它,将其分配给变量,然后继续。并请包含不止一行您的输入。请注意,如果一位数据乱序(即将字符串交换为 int),则会出现此错误。我确实测试了该分隔符,它适用于您的数据示例的重复行。我假设你的台词中没有空格。如果您使用句点而不是逗号,您也会收到该错误。
0赞 JoubasaurusREX 7/4/2023
那行了,谢谢你的帮助!