java - 由于 nextInt() 导致的 java.util.NoSuchElementException 类型的异常
问题描述
我有 2 个类,即 MyClient 和 CustomerUserInterface。MyClient 类有一个 main 方法,我在其中调用 CustomerUserInterface 的方法。
我的客户
public class MyClient {
public static void main(String args[]) {
CustomerUserInterface customerUserInterface = new CustomerUserInterfaceImpl();
Scanner scan = new Scanner(System.in);
customerUserInterface.registerLoginMenu();
int choice = scan.nextInt();
customerUserInterface.performOperationsOnRegisterLoginMenu(choice);
}
}
客户用户界面
public class CustomerUserInterfaceImpl implements CustomerUserInterface {
private CustomerBL customerBl;
private ProductInterface productInterface;
public CustomerUserInterfaceImpl() {
customerBl = new CustomerBLImpl();
productInterface = new ProductInterfaceImpl();
}
@Override
public void registerLoginMenu() {
System.out.println("1. Register");
System.out.println("2. Login");
System.out.println("3. Exit");
}
@Override
public void register() {
Customer customer = CustomerInputHelper.inputCustomer();
boolean status=false;
try {
status = customerBl.registerUser(customer);
}catch (SQLException e) {
e.printStackTrace();
}
if(status) {
System.out.println("Register Success");
login();
}
else {
System.out.println("Register Unsuccessful");
registerLoginMenu();
}
}
@Override
public void login() {
Scanner scan = new Scanner(System.in);
Boolean status=false;
System.out.println("Enter customerID : ");
int id = scan.nextInt();
System.out.println("Enter password : ");
String pwd = scan.next();
try {
status = customerBl.verifyUser(id, pwd);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(status) {
productInterface.afterLoginMenu();
System.out.println("Enter choice : ");
int choice = scan.nextInt();
Customer customer = null;
try {
customer = customerBl.getCustomer(id);
} catch (SQLException e) {
e.printStackTrace();
}
productInterface.performOperationsOnAfterLoginMenu(choice,customer);
}
else {
System.out.println("Login failed");
registerLoginMenu();
}
scan.close();
}
@Override
public void performOperationsOnRegisterLoginMenu(int choice) {
switch(choice) {
case 1:
register();
break;
case 2:
login();
break;
case 3:
System.out.println("Good Bye ! Have a Nice Day!");
System.exit(0);
}
}
}
我面临的问题是在我的第一条 System.out 行之后我在 login() 方法中出现错误,即
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
注册成功后,注册器调用登录方法,但在登录方法调用之后,我得到了上述错误。
我不明白用户注册时的问题,但在调用登录方法后立即显示错误。
解决方案
您在 system.in 上注册 Scanner 两次,一次在 MyClient 中:
public class MyClient {
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
并在 CustomerUserInterface 登录方法中:
@Override
public void login() {
Scanner scan = new Scanner(System.in);
这是行不通的,因为第一个扫描仪已经有 System.in 流。
您需要在整个程序中使用相同的扫描仪实例。
推荐阅读
- neo4j - Neo4j中标签索引的重建
- pygame - 蛇游戏中的碰撞检测
- c - 在 C 中进行多次撤消的简洁方法
- linux - 如何更改互联网的默认界面?
- python - 使用 Elasticsearch 过滤器进行搜索
- c++ - 什么是基于循环迭代几个元组的范围的简洁表示法
- java - 当我尝试使用 java FTPClient 从远程服务器删除文件时,我收到 500 作为回复代码
- javascript - 不通过 Node 应用程序访问 mongodb atlas 上的旧数据
- c++ - 如果系统内存足够,C++ 字符串是否可以包含无限数量的字符,并且 size_t 可以表示如此极端的长度吗?
- sonarqube - SonarQube 静态代码分析报告在本地声纳服务器而不是远程声纳服务器上发布