try-catch的几个问题

try-catch的几个问题

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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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