使用Scanner对象的Close方法后,程序报错:NoSuchElementException
package com.imooc2.course.Course5_1_Shopping;
// 商品类 属性:商品ID,商品名称,商品价格,商品描述
public class Goods {
private String goodsId;// 商品ID
private String goodsName;// 商品名称
private double price;// 商品价格
private String goodsDesp;// 商品描述
public Goods(String goodsId, String goodsName, double price, String goodsDesp) {
super();
this.setGoodsId(goodsId);
this.setGoodsName(goodsName);
this.setPrice(price);
this.setGoodsDesp(goodsDesp);
}
public String getGoodsId() {
return goodsId;
}
public void setGoodsId(String goodsId) {
this.goodsId = goodsId;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getGoodsDesp() {
return goodsDesp;
}
public void setGoodsDesp(String goodsDesp) {
this.goodsDesp = goodsDesp;
}
@Override
public String toString() {
return "商品信息 [编号:" + goodsId + ", 名称:" + goodsName + ", 价格:" + price + ", 描述:" + goodsDesp + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((goodsId == null) ? 0 : goodsId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (Goods.class == obj.getClass()) {
Goods goods = (Goods) obj;
return this.getGoodsId().equals(goods.getGoodsId());
}
return false;
}
}
//购物车中的商品类:属性:商品,数量
package com.imooc2.course.Course5_1_Shopping;
public class GoodsInCart {
private Goods goods;
private int num;
public GoodsInCart() {
}
public GoodsInCart(Goods goods, int num) {
super();
this.setGoods(goods);
this.setNum(num);
}
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "商品编号:" + goods.getGoodsId() + ", 商品名称:" + goods.getGoodsName() + ", 商品价格:" + goods.getPrice()
+ ", 商品描述:" + goods.getGoodsDesp() + ", 数量:" + this.getNum();
}
}
//商品管理类
package com.imooc2.course.Course5_1_Shopping;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class GoodsManager {
private Set<Goods> goodsSet;
public GoodsManager() {
}
public GoodsManager(Set<Goods> goodsSet) {
super();
this.goodsSet = goodsSet;
}
public Set<Goods> getGoodsSet() {
if (goodsSet == null)
goodsSet = new HashSet<Goods>();
return goodsSet;
}
public void setGoodsSet(Set<Goods> goodsSet) {
this.goodsSet = goodsSet;
}
//导入商品
public void importGoods() {
Goods good1 = new Goods("goods004", "手机", 2300.0, "android手机");
Goods good2 = new Goods("goods002", "饮水机", 299.0, "带净化功能的饮水机");
Goods good3 = new Goods("goods003", "笔记本电脑", 4999.0, "15寸笔记本电脑");
Goods good4 = new Goods("goods001", "水杯", 56.0, "不锈钢水杯");
this.getGoodsSet().add(good1);
this.getGoodsSet().add(good2);
this.getGoodsSet().add(good3);
this.getGoodsSet().add(good4);
System.out.println("商品信息导入成功");
}
//展示商品
public void showGoods() {
if (this.getGoodsSet().isEmpty()) {
System.out.println("还没有商品,记得导入商品信息哟");
return;
}
System.out.println("所有商品信息为:");
Iterator<Goods> it = this.getGoodsSet().iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
//购物车管理类
package com.imooc2.course.Course5_1_Shopping;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class ShoppingCart {
private Map<String, GoodsInCart> shoppingCart;
public ShoppingCart() {
}
public Map<String, GoodsInCart> getShoppingCart() {
if (shoppingCart == null)
shoppingCart = new HashMap<String, GoodsInCart>();
return shoppingCart;
}
public void setShoppingCart(Map<String, GoodsInCart> shoppingCart) {
this.shoppingCart = shoppingCart;
}
//添加商品到购物车
public void addGoodsToShoppingCart(GoodsManager goodsManager) {
if (goodsManager.getGoodsSet().isEmpty()) {
System.out.println("商城中还没有商品,请先导入系统预定商品!");
return;
}
goodsManager.showGoods();
String goodNum = "";//接收加入购物车的商品编号
int shopNum = 0;//接收将商品加入购物车的数量
GoodsInCart goodsInCart = new GoodsInCart();// 购物车中商品信息,含有商品名称和商品数量
Scanner sc = new Scanner(System.in);
boolean iDIsexit = false;//判断输入的ID是否已经添加到了购物车
do {
System.out.println("请输入商品编号:");
goodNum = sc.next();
if (this.getShoppingCart().containsKey(goodNum)) {
System.out.println("该商品已添加至购物车中,如需修改,请选择修改购物车中的商品数量");
return;// 如果使用continue要求重新输入编号的话,当购物车中添加了所有编号的商品时,会进入死循环;
}
for (Goods it : goodsManager.getGoodsSet()) {
if (it.getGoodsId().equals(goodNum)) {
goodsInCart.setGoods(it);// 将对应编号的商品,添加到购物车
iDIsexit = true;
break;
}
}
if (!iDIsexit) {
System.out.println("你输入的商品编号不存在,请重新输入:");
continue;
} else {
while (true) {
try {
System.out.println("请输入购买数量:");
shopNum = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("请输入整数:");
sc.next();
continue;
} catch (Exception e) {
e.printStackTrace();
break;
}
}
goodsInCart.setNum(shopNum);// 将输入的商品数量,保存到购物车
break;
}
} while (true);
this.getShoppingCart().put(goodNum, goodsInCart);// 将商品编号和对应的购买信息存入当前集合map;
// sc.close();此处不能使用close()方法,否则执行此方法后,再次遇到sc.next()会报错,为什么呢?我明明只关闭的是当前方法的Scanner对象呀!
System.out.println("商品添加购物车成功!");
}
//修改购物车中的商品数量
public void editNumInShopping() {
String goodsId = "";
int shoppingNum = 0;
if (this.getShoppingCart().isEmpty()) {
System.out.println("当前购物车是空的,请先添加商品到购物车");
return;
}
Scanner sc = new Scanner(System.in);
do {
this.showGoodsInShooping();
System.out.println("请输入要修改的商品编号:");
goodsId = sc.next();
if (!this.shoppingCart.containsKey(goodsId)) {
System.out.println("在购物车中找不到你输入的商品编号,请重新输入:");
continue;
} else {
while (true) {
try {
System.out.println("请输入新的购买数量");
shoppingNum = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("请输入整数:");
sc.nextLine();
continue;
} catch (Exception e) {
e.printStackTrace();
break;
}
}
if (shoppingNum == 0) {
System.out.println("购物车中的" + shoppingCart.get(goodsId).getGoods().getGoodsName() + "已清空");
shoppingCart.remove(goodsId);
} else
shoppingCart.get(goodsId).setNum(shoppingNum);
break;
}
} while (true);
// sc.close();
}
//显示购物车中的商品信息
public void showGoodsInShooping() {
System.out.println("显示购物车中的所有商品信息");
if (this.getShoppingCart().isEmpty()) {
System.out.println("还没有商品加入到购物车");
return;
}
Iterator<GoodsInCart> it = shoppingCart.values().iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
//结算购物车中的商品总价
public void countPrice() {
System.out.println("结算");
if (this.getShoppingCart().isEmpty()) {
System.out.println("还没有商品加入到购物车");
return;
}
int sumPrice = 0;//购物车中的商品总价
for (GoodsInCart goodsInCart : shoppingCart.values()) {
sumPrice += goodsInCart.getNum() * goodsInCart.getGoods().getPrice();
}
System.out.println("商品的总价为:" + sumPrice);
showGoodsInShooping();
// 方法1:通过便利得到key值,再使用HashMap的remove(key)的方法清空该集合,这样在删除多个元素的场景会报错:concurrentmodificationexception
/**
* for (String key : this.getShoppingCart().keySet()) {
* this.getShoppingCart().remove(key);
* }
**/
//方法二,将HashMao转化为Set集合,再使用Set集合中的removeAll方法可以清空集合
Set<Entry<String, GoodsInCart>> set = this.getShoppingCart().entrySet();
set.removeAll(set);
}
}
//主方法:
package com.imooc2.course.Course5_1_Shopping;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
//展示主菜单
static void showMasterMeau() {
System.out.println("*******************************");
System.out.println(" **主菜单**");
System.out.println(" 1--商品管理");
System.out.println(" 2--购物车");
System.out.println(" 0--退出");
System.out.println("*******************************");
System.out.println("请选择对应数字进行操作:");
}
//展示商品管理菜单
static void showGoodsManagerMeau() {
System.out.println("*******************************");
System.out.println(" **商品管理**");
System.out.println(" 1--商品信息导入");
System.out.println(" 2--显示所有商品信息");
System.out.println(" 9--返回上一级菜单");
System.out.println("*******************************");
System.out.println("请选择对应数字对商品进行管理:");
}
//展示购物车菜单
static void showShoppingManagerMeau() {
System.out.println("*******************************");
System.out.println(" **购物车管理**");
System.out.println(" 1--添加商品到购物车");
System.out.println(" 2--修改购物车中的商品数量");
System.out.println(" 3--显示购物车中的所有商品信息");
System.out.println(" 4--结算");
System.out.println(" 9--返回上一级菜单");
System.out.println("*******************************");
System.out.println("请输入对应的数字对购物车进行管理:");
}
GoodsManager goodsManager = new GoodsManager();//实例化商品管理类
ShoppingCart shoppingCart = new ShoppingCart();//实例化购物车管理类
Scanner sc = new Scanner(System.in);
//商品管理相关功能
void goodsManager() {
int goodsManagerSelector = 0;//存放商品管理菜单输入的指令
do {
while (true) {
try {
showGoodsManagerMeau();
goodsManagerSelector = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("请输入整数:");
sc.nextLine();
continue;
} catch (Exception e) {
e.printStackTrace();
break;
}
}
if (goodsManagerSelector == 1) {
goodsManager.importGoods();
} else if (goodsManagerSelector == 2) {
goodsManager.showGoods();
} else if (goodsManagerSelector == 9) {
return;
} else {
System.out.println("你输入的指令不存在请重新输入:");
continue;
}
} while (true);
}
//购物车相关功能
void shopManager() {
int shoppingManagerSelector = 0;//存放购物车菜单相关指令
do {
while (true) {
try {
showShoppingManagerMeau();
shoppingManagerSelector = sc.nextInt();//如果添加商品的方法中又sc.close(),当购物车中添加商品的方法执行后,再次执行到此处会报错:NoSuchElementException
break;
} catch (InputMismatchException e) {
System.out.println("请输入整数:");
sc.nextLine();
continue;
} catch (Exception e) {
e.printStackTrace();
break;
}
}
switch (shoppingManagerSelector) {
case 1:
shoppingCart.addGoodsToShoppingCart(goodsManager);
break;
case 2:
shoppingCart.editNumInShopping();
break;
case 3:
shoppingCart.showGoodsInShooping();
break;
case 4:
shoppingCart.countPrice();
break;
case 9:
return;
default:
System.out.println("你输入的指令不存在请重新输入:");
continue;
}
} while (true);
}
public static void main(String[] args) {
int masterMeauSelector = 0;//存放主菜单选择的指令
Test test = new Test();
Scanner sc = new Scanner(System.in);
do {
while (true) {
try {
showMasterMeau();
masterMeauSelector = sc.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("请输入整数:");
sc.nextLine();
continue;
} catch (Exception e) {
e.printStackTrace();
break;
}
}
if (masterMeauSelector == 1) {
test.goodsManager();
} else if (masterMeauSelector == 2) {
test.shopManager();
} else if (masterMeauSelector == 0) {
break;
} else {
System.out.println("没有该指令对应的操作,请重新选择:");
continue;
}
} while (true);
sc.close();
}
}=====================================================
各位大侠,通过这个作业,
我一共有三个疑问:
问题1:为什么使用Scanner对象的Close方法后,再次遇到其他Scanner对象的next()方法时程序会报错?
问题2:为了保证输入的数字是整数,我使用了很多的TryCatch语句块,感觉太繁琐了,有没有更加简洁的办法?
问题3:当输入的字符被定义为字符串时,是不是就不会有什么异常,不需要TryCatch语句块去处理了?
关于本题实现,如果有其他建议,希望大家指正~
======================
新手上路,多多关照~
1
收起
正在回答
2回答
1、NoSuchElementException是没有元素可以迭代异常。sc.close();进行关闭处理,会把System.in也关闭了,System.in是InputStream的对象,并且关掉之后不能再打开。所以建议不要关闭Scanner对象
,一般是不关闭Scanner对象的。如果一定要关,建议你在停止整个程序的时候,再关掉。
Java零基础入门18
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星