You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取文件触发InputMismatchException异常求助

Java文件读取异常与类型判断问题排查

我编写了一段Java代码,基于父类Media和子类DingDong、Beeper,从文本文件读取格式如D123456,JohnD,28123,154,8045的数据,按类型存入对应子类对象数组。但运行时输出Incorrect code: null,且抛出InputMismatchException异常,相关代码及异常信息如下:

代码实现

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();
    }
}

运行异常信息

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)

问题排查与修复方案

1. 类型判断错误(触发Incorrect code: null)

代码中type = id.charAt(1);是错误的,示例数据D123456的类型标识是第一个字符D,而非索引1的1。应改为:

type = id.charAt(0);

同时else分支中arr[numObjects]尚未赋值,输出的是null,应改为输出错误的id:

System.out.println("Incorrect code: " + id);

2. InputMismatchException异常原因

触发else分支后,未处理当前行剩余的输入数据,导致后续input.nextInt()读取到非整数内容(如下一行的字符串)。需在else分支中跳过当前行剩余内容:

else
{
    System.out.println("Incorrect code: " + id);
    input.nextLine(); // 清空当前行未读取的内容,避免后续读取混乱
}

3. 循环遍历错误(隐藏的数组越界风险)

两个for循环的循环变量错误递增numObjects,而非i,且循环条件i <= numObjects会导致访问数组的空元素。修正为:

// 修正后的列表遍历
System.out.println("List of postings");
for(int i = 0; i < numObjects; i++)
{
    System.out.println(arr[i]);
}

// 修正后的分数遍历
System.out.println("Scores of postings");
for(int i = 0; i < numObjects; i++)
{
    // 调整格式符,匹配字符串+浮点数的输出格式,避免类型不匹配
    System.out.printf("%-20s %7.2f%n", arr[i].getID() + " " + arr[i].getAuthor(), arr[i].calculateScore());
}

4. 最后一行输出的空指针与格式错误

原代码最后一行System.out.printf("%-8%7.2f",arr[numObjects].getID() + arr[numObjects].author + arr[numObjects]);存在三个问题:

  • arr[numObjects]为null,会触发空指针异常;
  • author若为私有变量,无法直接访问,需用getAuthor()方法;
  • 字符串与浮点数拼接结果为字符串,不能用%7.2f格式化。
    建议删除该行,或调整为符合遍历逻辑的输出。

内容的提问来源于stack exchange,提问作者JoubasaurusREX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:17:41