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

使用Java Scanner反复出现NoSuchElementException异常求助

解决Java Scanner的NoSuchElementException及数组越界问题

问题原因分析

  1. NoSuchElementException:sc.nextLine()在没有可用输入行时会抛出该异常——比如程序运行时未提供任何输入,或者输入流被提前关闭。
  2. 隐藏的数组越界问题:当前代码直接访问words[1],如果用户只输入1个单词,会触发ArrayIndexOutOfBoundsException;另外用split(" ")处理多空格分隔的名字时,会生成空字符串元素,同样可能导致后续索引访问出错。

修复方案

1. 先判断输入是否存在

调用nextLine()前,先用sc.hasNextLine()确认有可用输入,避免直接读取导致异常。

2. 鲁棒处理输入分割

用split("\\s+")替代split(" "),可以匹配任意数量的空白字符(空格、制表符等),避免生成空字符串元素;同时增加对数组长度的判断,防止索引越界。

修改后的完整代码

import java.util.Scanner; 

public class LabProgram {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      
      // 先检查是否有输入行
      if (sc.hasNextLine()) {
         String name = sc.nextLine().trim(); // 去除首尾空白
         // 处理空输入的情况
         if (name.isEmpty()) {
             System.out.println("请输入有效的姓名");
             sc.close();
             return;
         }
         
         String[] words = name.split("\\s+"); // 匹配任意空白字符分割
         String firstName = words[0];
         
         // 根据姓名部分数量处理
         if (words.length == 1) {
             System.out.println(firstName);
         } else if (words.length == 2) {
             String lastName = words[1];
             System.out.println(lastName + ", " + firstName.charAt(0) + ".");
         } else {
             // 取前两个名字的首字母,最后一个作为姓氏
             String middleName = words[1];
             String lastName = words[words.length - 1];
             System.out.println(lastName + ", " + firstName.charAt(0) + "." + middleName.charAt(0) + ".");
         }
      } else {
          System.out.println("未检测到输入内容");
      }
      
      sc.close();
   }
}

关键改动说明

  • 增加sc.hasNextLine()判断,避免无输入时抛出异常
  • 用trim()去除输入首尾空白,配合split("\\s+")处理多空格分隔的场景
  • 增加对输入为空、姓名只有1部分的情况处理,避免数组索引越界
  • 当姓名超过3部分时,默认取最后一个作为姓氏,前两个的首字母(更符合常见姓名格式)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:40:22