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版
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星