Scanner方法的关闭问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | //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一种。)
1 2 | Scanner sc = new Scanner(System.in) sc.close(); |
sc.close()这个语句不仅可以关闭sc这个对象,也会同时关闭System.in这个控制台输入流,这个输入流关闭了,其他类的Scanner就没办法调用System.in,所以导致报错。如果碰到System.in这样的Scanner对象,一般不会去手动关闭。
在你的代码中,sc.close()后面,马上就return了
1 2 | Sc.close(); return arr; |
其实这里可以不用关闭,因为这个Sc对象的作用域就在这个方法中,方法结束,该Sc的引用就结束了,很快会被内存的垃圾回收机制回收,也会达到同样的效果,但是不会关闭System.in这个控制台的输入流。其他Scanner还是可以调用System.in。
java工程师2020版
- 参与学习 人
- 提交作业 9402 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧