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

如何修复无thirdName输入时的Java Scanner逻辑与NoSuchElementException错误

修复姓名格式化代码的问题

原代码的核心问题

  1. Scanner读取逻辑错误:混合使用next()和nextLine()时,next()会停在空格处,留下换行符在输入缓冲区,后续nextLine()会读取这个空行,导致thirdName不是预期内容;当输入无空格(比如连续的名字字符串),next()会因无法读取第二个输入抛出NoSuchElementException。
  2. 名字顺序逻辑颠倒:原代码错误地将第二个输入当作中间名、第三个输入当作姓氏,和需求的「姓首字母 + 名 + 中间名首字母」格式不符。
  3. 空值判断错误:thirdName.equals(null)永远不会成立,因为nextLine()不会返回null,空输入时它会返回空字符串而非null。

修复后的代码

import java.util.Scanner; 

public class LabProgram {
   public static void main(String[] args) {
      Scanner scnr = new Scanner(System.in);       
      
      // 读取整行输入,按任意数量空格分割为名字数组
      String[] nameParts = scnr.nextLine().split("\\s+");
      
      String firstName = nameParts[0];
      String lastName = nameParts[nameParts.length - 1];
      
      if (nameParts.length == 2) {
         // 无中间名的情况:姓首字母., 名
         System.out.printf("%c., %s%n", lastName.charAt(0), firstName);
      } else if (nameParts.length == 3) {
         // 有中间名的情况:姓首字母., 名 中间名首字母.
         String middleName = nameParts[1];
         System.out.printf("%c., %s %c.%n", lastName.charAt(0), firstName, middleName.charAt(0));
      }
      
      scnr.close();
   }
}

修复说明

  • 改用nextLine()读取整行输入,再用split("\\s+")按任意数量空格分割成名字数组,同时兼容2个或3个名字的输入场景。
  • 直接通过数组长度判断是否存在中间名:数组长度为2时无中间名,长度为3时存在中间名。
  • 使用printf简化格式化输出,避免字符串拼接的繁琐,同时保证格式准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:18:29