try-catch的几个问题

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);
    }
     
}
  1. 在catch中使用continue会直接跳回一级菜单开始下一次循环,如何才能只跳回上一级菜单呢?比如成绩输错了只重新输入成绩而非从头开始。

  2. 如果不在一开始用if(choice==0)来判断程序结束,而是在do-while中用while(choice!=0)来判断就会报错,主方法中的全局变量被try-catch包裹后就无法作用于while判断条件了是为什么呢?

  3. sc的控制台输入应该在什么时候关闭呢?do-while结束后写sc.close()会报错

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,

1、不循环的情况下返回上一级,这部分在这个作业中是无法实现的哦~同学可以不用纠结个功能哦~只需要实现提示信息并重新输入的操作就可以了~

2、try-catch语句对变量值作用范围:

  • 在语句块内部定义的变量,作用域在语句块内部,外部不可见。

  • 在语句块外部定义的变量,在语句块内部可以对变量进行修改。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • hblack 提问者 #1
    在语句块外部定义的变量,但是在语句块内完成初始化的,也是外部不可见吗?
    2019-08-14 21:22:18
  • 好帮手慕酷酷 回复 提问者 hblack #2
    同学你好,你的理解是正确的,在语句外部定义的变量,在语句块内完成初始化,对外部也是不可见的~ 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-08-15 09:36:50
好帮手慕酷酷 2019-08-14 16:38:10

同学你好,作业完成的不错,

1、如果想要重新输入成绩,应该使用如下思路:

输入有误之后,我们应该让用户重新输入本次的成绩,所以这里我们可以使用i--;并跳过此次循环,进行下次循环。使其仍为本次数据赋值,修改后的代码如下图所示:

http://img1.sycdn.imooc.com//climg/5d53c3980001ffff05790255.jpg

2、 main方法中的变量都是局部变量,并不是全局变量,我们需要为它进行初始化。只有定义在类中的才是全局变量。

while(choice!=0)会报错的原因是, while(choice!=0)会报错是因为按照程序的执行顺序,首先进行whlie语句的判断,而choice并未给它赋值,所以会报错。而while(true)不会报错,是因为在图片的位置处进行了初始化赋值,如图:

http://img1.sycdn.imooc.com//climg/5d53c69e00015c5603190079.jpg

3、sc在这个作业中不需要关闭哦~报错的原因是:因为一旦调用close()方法,所有的Scanner对象的入口都被关闭了,这个对象比较特殊

另外建议同学将作业提交!

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!



  • 提问者 hblack #1
    循环输入成绩时用i--重复为一个元素赋值这一点我会,但是我不太清楚如何在不循环的情况下返回上一级,例如在初始化成绩单数组选择数组长度时输入一个字母,catch (Exception e) { System.out.println("输入错误,请重新输入!"); sc.next(); continue; catch块中这一段代码会直接从第一级菜单重新开始,我希望能返回输入学生数量这一级; while(choice!=0)如果不在最开始的int choice=sc.nextInt()上加try-catch语句就不会报错,我想知道try-catch语句对变量值作用范围的影响。 谢谢老师!
    2019-08-14 17:10:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码