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
相关产品推荐
相关产品推荐

