为什么这个程序,在输入第1个成绩的时候,如果输入字符会出现报错?该如何修改?

为什么这个程序,在输入第1个成绩的时候,如果输入字符会出现报错?该如何修改?

问题描述:为什么这个程序在请输入第1个成绩的时候,如果输入错误会出现程序报错。而在输入第2个成绩,第3个成绩或者其他位置输入的时候输入错误都不会报错,这是什么原因呢?该如何修改,才能在第1次输入成绩时候,输入错误也不会报错,并且直接返回让用户重新再次输入第一次成绩?

相关截图:

http://img1.sycdn.imooc.com//climg/60b9fe4408a374fa17040685.jpg

相关代码:

package com.stage1;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
* 学生成绩管理系统
*
* @author 冰凤
*
*/
public class SecondWeek {
/**
* 显示菜单
*/
public void displayMenu() {
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("请输入对应数字进行操作:");
}

/**
* 初始化数学成绩,数组的长度和元素均由键盘输入
*
* @return 返回数组元素
*/
public float[] intscore() {
Scanner sc = new Scanner(System.in);
int n = 0;
System.out.println("请输入要存储的数学成绩的数量:");
try {
n = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("输入的数据有误,请输入正整数");
sc.next();
}
float a[] = new float[n];
for (int i = 0; i < n; i++) {
System.out.println("请输入第" + (i + 1) + "个成绩:");
try {
a[i] = sc.nextFloat();
} catch (InputMismatchException e) {
System.out.println("输入的数据有误,请输入非负数");
sc.next();
i--;
}
if(a[i]<0) {
System.out.println("输入的数据有误,请输入非负数");
i--;
}
}
return a;
}

/**
* 求平均成绩
*
* @param f 数组
* @return 返回平均值
*/
public float average(float[] f) {
float sum = 0;
for (int i = 0; i < f.length; i++) {
sum += f[i];
}
float average = sum / f.length;
System.out.println("数学平均成绩为:" + average);
return average;
}

/**
* 统计成绩大于85分的人数
*
* @param f 成绩数组
* @return 大于85分的人数
*/
public int count(float[] f) {
int count = 0;
for (float n : f) {
if (n > 85) {
count++;
}
}
System.out.println("成绩大于85分的人数为:" + count);
return count;
}

/**
* 修改指定位置处的成绩
*
* @param f 成绩数组
* @param index 位置,从0开始,与数组下标对应
* @param newscore 需要插入修改的成绩
*/
public void update(float[] f, int index, float newscore) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入要修改成绩的位置(从0开始):");
try {
index = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("输入的数据有误,请输入从0开始的对应位置整数");
sc.next();
continue;
}
boolean j = false;
for (int i = 0; i < f.length; i++) {
if (index == i) {
j = true;
}
}
if (!j) {
System.out.println("输入的数据有误,请输入从0开始的对应位置整数");
continue;
}
System.out.println("请输入新数据:");
try {
newscore = sc.nextFloat();
} catch (InputMismatchException e) {
System.out.println("输入的数据有误,请输入非负数");
sc.next();
continue;
}
if (newscore < 0) {
System.out.println("输入的数据有误,请输入非负数");
continue;
}
f[index] = newscore;
break;
}
}

/**
* 打印输出成绩数组中的所有元素
*
* @param f 成绩数组
*/
public void displayAllScore(float[] f) {
String s = "";
System.out.println("成绩为:");
for (int i = 0; i < f.length; i++) {
s = s + f[i] + " ";
}
System.out.println(s);
}

public static void main(String[] args) {
SecondWeek sw = new SecondWeek();
Scanner sc = new Scanner(System.in);
int input = 0, p = 0;
float s = 0;
float[] f = null;
while (true) {
sw.displayMenu();
try {
input = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("输入的数据有误,请输入0-5之间的整数");
sc.next();
continue;
}
if (input == 0) {
System.out.println("退出程序!");
break;
}
boolean t = false;
for (int i = 1; i < 6; i++) {
if (input == i)
t = true;
}
if (t) {
switch (input) {
case 1:
f = sw.intscore();
break;
case 2:
if (f != null) {
sw.average(f);
} else {
System.out.println("未输入数学成绩,请先选择“1”,初始化数学成绩");
}
break;
case 3:
if (f != null) {
sw.count(f);
} else {
System.out.println("未输入数学成绩,请先选择“1”,初始化数学成绩");
}
break;
case 4:
if (f != null) {
System.out.println("修改前:");
sw.displayAllScore(f);
sw.update(f, p, s);// p表示位置,s表示需要替换的分数值
System.out.println("修改后:");
sw.displayAllScore(f);
} else {
System.out.println("未输入数学成绩,请先选择“1”,初始化数学成绩");
}
break;
case 5:
if (f != null) {
sw.displayAllScore(f);
} else {
System.out.println("未输入数学成绩,请先选择“1”,初始化数学成绩");
}
break;
}
} else {
System.out.println("输入的数据有误,请输入0-5之间的整数");
}
}
}

}


正在回答

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

1回答

同学你好,根据报错显示是数组越界异常,因为第一次输入有误后,代码运行到catch语句中进行了i--的操作,此时i为-1,然后代码运行到if判断时,判断条件为a[-1]<0,而数组中并没有该数据,所以报错

http://img1.sycdn.imooc.com//climg/60ba00ff09c9216305160319.jpg

同学可以将if判断放到try中,表示输入的成绩小于0,进入if语句后进行i--,重新执行for循环

http://img1.sycdn.imooc.com//climg/60ba016509a8f7ec05430363.jpg

祝学习愉快~


  • 蒋昌魁 提问者 #1

    谢谢,原因知道了,但是想实现输入第1个成绩的时候,既不能输入字符也不能输入负数,该怎么做呢?感觉上下两个逻辑交叉了,怎么做到同时实现呢?

    2021-06-04 22:37:52
  • 蒋昌魁 提问者 #2

    我自己已经找到解决方法了,谢谢

    2021-06-04 23:23:31
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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