try-catch的几个问题
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | package com.imooc; import java.util.Scanner; public class ScoreList { private int num; private float [] scoreList; //成绩单管理系统私有属性:学生人数num及成绩单数组scoreList public int getNum() { return num; } public float [] getScoreList() { return scoreList; } public void setScoreList( float [] scoreList) { this .scoreList = scoreList; } public void setNum( int num) { this .num = num; } public ScoreList( int num, float [] scoreList) { super (); this .num = num; this .scoreList = scoreList; } //生成ScoreList的有参/无参构造以及参数的get/set方法 public ScoreList() { super (); // TODO 自动生成的构造函数存根 } //求数组平均值 public float averScore() { float sum = 0 ; for ( int i= 0 ; i<scoreList.length; i++) { sum+=scoreList[i]; } float averScore=sum/scoreList.length; return averScore; } //统计85以上的人数 public int highScoreNum() { int num = 0 ; for ( int i= 0 ; i<scoreList.length; i++) { if (scoreList[i]> 85 ) { num++; } } return num; } //更新第(i+1)个数据 public void updateScore( int i, float score) { scoreList[i] = score; } //显示所有成绩 public void display() { System.out.println( "成绩为:" ); for ( int i = 0 ; i<scoreList.length; i++) { System.out.print(scoreList[i]+ " " ); } } //显示操作菜单 public void menu() { System.out.println( "***************************************" ); System.out.println( " 1--初始化数学成绩" ); System.out.println( " 2--求成绩平均值" ); System.out.println( " 3--统计成绩大于85分的人数" ); System.out.println( " 4--修改指定位置处的成绩" ); System.out.println( " 5--打印输出所有成绩" ); System.out.println( " 0--退出" ); System.out.println( "***************************************" ); System.out.println( "请输入对应数字进行操作:" ); } public static void main(String[] args) { // TODO 自动生成的方法存根 float [] scoreList; int num; int choice; ScoreList list = new ScoreList(); Scanner sc = new Scanner(System.in); //do-while循环展示操作菜单,完成循环操作 do { System.out.println(); System.out.println(); list.menu(); try { choice = sc.nextInt(); if (choice== 0 ) { System.out.println( "退出程序!" ); return ; //输入0时退出程序 } } catch (Exception e) { System.out.println( "输入有误,请重新输入!" ); sc.next(); continue ; //输入格式错误时报错并进行下次循环 } switch (choice){ case 1 : System.out.println( "请输入要存储的数学成绩的数量:" ); try { num=sc.nextInt(); while (num< 1 ) { System.out.println( "输入范围错误,请重新输入!" ); num=sc.nextInt(); } //数组长度小于1时循环输入 } catch (Exception e) { System.out.println( "输入错误,请重新输入!" ); continue ; } scoreList= new float [num]; for ( int i = 0 ; i<num ; i++) { System.out.println( "请输入第" +(i+ 1 )+ "个数据:" ); try { scoreList[i]=sc.nextInt(); if (scoreList[i]< 0 || scoreList[i]> 100 ) { System.out.println( "输入范围错误,请重新输入!" ); i--; } //成绩小于0或大于100时重新输入 } catch (Exception e) { System.out.println( "输入错误,请重试!" ); continue ; } } System.out.println( "初始化完成!" ); list.setScoreList(scoreList); break ; case 2 : if (list.getScoreList()== null ) { System.out.println( "请先初始化成绩单!" ); continue ; } System.out.println( "平均成绩为:" +list.averScore()); break ; case 3 : if (list.getScoreList()== null ) { System.out.println( "请先初始化成绩单!" ); continue ; } System.out.println( "85分以上的人数为:" +list.highScoreNum()); break ; case 4 : if (list.getScoreList()== null ) { System.out.println( "请先初始化成绩单!" ); continue ; } System.out.println( "修改前:" ); list.display(); System.out.println( "请输入要修改的数据位置(从0开始):" ); int i; try { i = sc.nextInt(); } catch (Exception e) { System.out.println( "输入错误,请重试!" ); continue ; } System.out.println( "请输入新数据:" ); float score; try { score = sc.nextFloat(); while (score< 0 || score> 100 ) { System.out.println( "输入范围错误,请重新输入!" ); score = sc.nextFloat(); } } catch (Exception e) { System.out.println( "输入错误,请重试!" ); continue ; } try { list.updateScore(i, score); } catch (Exception e) { System.out.println( "修改数据不存在!" ); continue ; } System.out.println( "修改后:" ); list.display(); break ; case 5 : if (list.getScoreList()== null ) { System.out.println( "请先初始化成绩单!" ); continue ; } list.display(); break ; default : System.out.println( "无效命令,请重新输入!" ); } } while ( true ); } } |
在catch中使用continue会直接跳回一级菜单开始下一次循环,如何才能只跳回上一级菜单呢?比如成绩输错了只重新输入成绩而非从头开始。
如果不在一开始用if(choice==0)来判断程序结束,而是在do-while中用while(choice!=0)来判断就会报错,主方法中的全局变量被try-catch包裹后就无法作用于while判断条件了是为什么呢?
sc的控制台输入应该在什么时候关闭呢?do-while结束后写sc.close()会报错
正在回答
同学你好,
1、不循环的情况下返回上一级,这部分在这个作业中是无法实现的哦~同学可以不用纠结个功能哦~只需要实现提示信息并重新输入的操作就可以了~
2、try-catch语句对变量值作用范围:
在语句块内部定义的变量,作用域在语句块内部,外部不可见。
在语句块外部定义的变量,在语句块内部可以对变量进行修改。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
同学你好,作业完成的不错,
1、如果想要重新输入成绩,应该使用如下思路:
输入有误之后,我们应该让用户重新输入本次的成绩,所以这里我们可以使用i--;并跳过此次循环,进行下次循环。使其仍为本次数据赋值,修改后的代码如下图所示:
2、 main方法中的变量都是局部变量,并不是全局变量,我们需要为它进行初始化。只有定义在类中的才是全局变量。
while(choice!=0)会报错的原因是, while(choice!=0)会报错是因为按照程序的执行顺序,首先进行whlie语句的判断,而choice并未给它赋值,所以会报错。而while(true)不会报错,是因为在图片的位置处进行了初始化赋值,如图:
3、sc在这个作业中不需要关闭哦~报错的原因是:因为一旦调用close()方法,所有的Scanner对象的入口都被关闭了,这个对象比较特殊
另外建议同学将作业提交!
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧