Scanner方法的关闭问题
//InitScore类封装在了自己的.java文件中,这里有调用Scanner方法进行数据的接收
public class InitScore {
public float[] initScore() {
System.out.println("请输入要储存的数学成绩的数量:");
Scanner Sc = new Scanner(System.in);
int arrayLength = Sc.nextInt();
float[] arr = new float[arrayLength];
for(int i = 0 ; i < arrayLength ; i ++ ) {
System.out.println("请输入第"+ (i+1)+"个数据:");
try {
arr[i] = Sc.nextFloat();
}catch(java.util.InputMismatchException e) {
System.out.println("输入的数据格式有误,请重新输入!");
Sc.next();
i --;
}
}
// Sc.close();
return arr;
}
}
//这是主方法,有调用InitScore来初始化成绩,为何上面的类对Scanner方法进行关闭,会影响下面主方法中对Scanner的调用。
public class DataManage {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = 0;
do {
// 调用DisplayMenu方法,展示菜单
DisplayMenu dm = new DisplayMenu();
dm.displayMenu();
System.out.println("请输入对应的数字进行操作:");
input = sc.nextInt();
switch (input) {
case 1:
// 调用初始化数学成绩方法
InitScore is = new InitScore();
is.initScore();
System.out.println("初始化数学成绩成功");
break;
case 2:
break;
case 3:
break;
case 4:
//调用方法修改指定位置处成绩
break;
case 5:
break;
case 0:
System.out.println("退出成功");
sc.close();
break;
}
} while (true);
}
}23
收起
正在回答 回答被采纳积分+1
3回答
慕丝1539783
2020-10-12 23:29:43
因为你的代码,两次都是调用Scanner(System.in)。(Scanner后面括号内的参数不止System.in一种。)
Scanner sc = new Scanner(System.in) sc.close();
sc.close()这个语句不仅可以关闭sc这个对象,也会同时关闭System.in这个控制台输入流,这个输入流关闭了,其他类的Scanner就没办法调用System.in,所以导致报错。如果碰到System.in这样的Scanner对象,一般不会去手动关闭。
在你的代码中,sc.close()后面,马上就return了
Sc.close(); return arr;
其实这里可以不用关闭,因为这个Sc对象的作用域就在这个方法中,方法结束,该Sc的引用就结束了,很快会被内存的垃圾回收机制回收,也会达到同样的效果,但是不会关闭System.in这个控制台的输入流。其他Scanner还是可以调用System.in。
java工程师2020版
- 参与学习 人
- 提交作业 9410 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星