java.util.NoSuchElementException解决

这篇博客讨论了在Java中处理IOException时遇到的NoSuchElementException问题。文章通过一个实例展示了如何使用异常捕获机制来实现用户输入的员工信息验证。在用户输入不合法时,程序会提示用户重新输入。当尝试读取中文姓名时,`sc.next()`可能会抛出异常。解决方案是删除所有的`sc.close()`调用,以防止过早关闭Scanner导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目
/**

  • 使用异常捕获机制完成下述IO操作
  • 编写程序,要求下面的类实现功能:
  • 添加新员工
  • 要求用户输入一个员工信息,格式如下:
  • jackson,25,男,5000,2008-12-22
  • 用户输入后需要做下述验证:
  • 要求用户名长度在1-20个字符之间且必须是英文
  • 年龄在0-100之间的整数
  • 性别只能是:“男"或"女”
  • 当发现用户输入有不符合规定时,提醒用户
  • 相关内容输入不符合要求,并要求重新输入。
  • 都输入正确后,将该员工添加到emp.txt文件
  • 的最后一行。
    */

Emp类:

package Lesson07;

import java.util.Scanner;

public class Emp {
	private static String emp0;
	private String name;
	private short age;
	private String gender;
	private int salary;
	private long hiredate;
	
	public Emp(){}
	public void setEmp(){
		Scanner sc = new Scanner(System.in);
		String emp;
		System.out.println("请输入一个员工信息,格式如下:\njackson,25,男,5000,2008-12-22");
		emp =sc.next();
		String[] emp1 = new String[5];
		
		for(int i=0;i<4;i++){//截出几部分
			int index = emp.indexOf(",");
			emp1[i] = emp.substring(0, index);
			emp = emp.substring(index+1);
		}
		emp0 = emp;//保存有“-”的日期,在最后输出时使用
		emp1[4] = "";//把日期“-”去掉转化为long
		for(int i = 0;i<2;i++) {
			int index = emp.indexOf("-");
			emp1[4] = emp1[4]+emp.substring(0, index);
			emp = emp.substring(index+1);
		}
		emp1[4] = emp1[4]+emp;
		
		name = emp1[0];
		age = Short.parseShort(emp1[1]);
		gender = emp1[2];
		salary = Integer.parseInt(emp1[3]);
		hiredate = Long.parseLong(emp1[4]);
		sc.close();
	}
		
		
	public void setName() {
		Scanner sc = new Scanner(System.in);
		String name1 = sc.nextLine();
		this.name = name1;
		sc.close();
	}
	public void setAge() {
		Scanner sc = new Scanner(System.in);
		short age1 = sc.nextShort();
		this.age = age1;
		sc.close();
	}
	public void setGender() {
		Scanner sc = new Scanner(System.in);
		String gender1 = sc.next();
		this.gender = gender1;
		sc.close();
	}

	public void namecheck(){
		String reg = "^[\\u4e00-\\u9fa5]{0,}$";//正则表达式判断是否有中文
		if(name.length()<0||name.length()>20){
			System.out.println("姓名输入错误,请重新输入姓名:");
			setName();
		}
		else if(name.matches(reg)){
			System.out.println("姓名输入错误,请重新输入姓名:");
			setName();
		}
	}
	public void agecheck(){
		if(age<0||age>100){
			System.out.println("年龄输入错误,请重新输入年龄:");
			setAge();
		}
	}
	public void gendercheck(){
		if(gender.equals("男")||gender.equals("女")){
		}else {
			System.out.println("性别输入错误,请重新输入性别:");
			setGender();
		}
	}
	@Override
	public String toString() {
		return "\n"+name+","+age+","+gender+","+salary+","+emp0;
	}	
}
public class Test06 {
	public static void main(String[] args) {
		Emp emp = new Emp();
		emp.setEmp();
		emp.namecheck();
		emp.agecheck();
		emp.gendercheck();
		String emp111 = emp.toString();
		
		try {
			File file = new File("d:/emp.txt");
			FileOutputStream Fout = new FileOutputStream(file,true);
			byte b[] =emp111.getBytes();
			Fout.write(b);
			Fout.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("成功!");
	}
}

假如name输入中文的话本身要重新输入的,就会在emp = sc.next();出现错误
在这里插入图片描述
最后发现只要删掉所有sc.close();就可以了在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值