要求:完成一个 java application应用程序,接收用户通过键盘不断输入表示某门课程的成绩的字符串(按回车为一个字符串结束),当输入非法数字(输入值小于0或大于100)时提示成绩输入有误,当输入为非数字的字符串时提示输入格式不合法。
1.思路与知识点
此任务和之前相似仍需要自行定义异常类型,而此处异常要考虑两种情况,一是输入的字符串并非数字;二是输入的字符串数字过大或过小超出了现实中成绩的常规范围。这也是此题的关键,即如何去判断输入的字符串是否符合要求,可以总结为以下两个知识点:
- 从字符串中提取数字(参考链接)
在Java中,有时需要获取字符串中的数字进行后续判断,常用的从字符串中提取数字的方法有:正则表达式和用字符串方法处理。
这里采用的是第二种方法,使用for循环依次遍历字符串的每个字符,在遍历时使用if判断每个字符是否为数字。此外,在遍历时用到的charAt方法有:
//charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法,
//charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.
//如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符.
- String类型转换为int类型
Java中String字符串类型转换为int类型主要方法是使用Integer中的parseInt()等方法。查找jdk文档可看到:
根据帮助文档可以看到具体语法有:
int 变量名 = Integer.parseInt(String 变量名);
2.代码
import java.util.Scanner;
/*
完成一个 java application应用程序,接收用户通过键盘不断输入表示某门课程的成绩的字符串(按回车为一个字符串结束),
当输入非法数字(输入值小于0或大于100)时提示成绩输入有误,当输入为非数字的字符串时提示输入格式不合法。
*/
public class ExceptionWork3 {//类名
public static void main(String[] args) {//主入口
while (true){//定义死循环
Scanner s = new Scanner(System.in);//输入对象创建,键盘等待用户输入直到输入回车停止接收
System.out.println("请输入某门课程的成绩:");
String grade = s.nextLine();//读取键盘输入字符串
MygradeException m = new MygradeException();//自定义异常对象创建
if (!grade.equals("quit")){//未执行退出指令时
//异常捕捉
try {//未发生异常时执行try代码块
String a = m.Grades(grade);//将键盘输入字符串数据赋值到自定义异常类参数中
System.out.println("成绩记录成功");
}catch (Exception e){//发生异常时执行catch代码块
e.printStackTrace();//控制台打印输出异常信息
System.out.println("请重新输入合法成绩");
}
}else {//用户输入“quit”后终止循环强制退出。
System.exit(0);
}
}
}
}
//自定义异常类型GradeException继承父类Exception
class GradeException extends Exception{
public GradeException(String msg){
super(msg);//继承父类构造方法
}
}
//自定义MygeadeException用于向上(GradeException)抛出异常
class MygradeException{
public String Grades(String grade)throws GradeException{//定义方法Grades向GradeException抛出异常
String a = grade;
//判断输入字符串是否是数字
for (int i=0;i<a.length();i++){//使用length()方法获取字符串长度,进而遍历字符串
//charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法,
//charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.
//如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符.
if (a.charAt(i)<'0' || a.charAt(i)>'9'){//通过遍历检索字符串中的每一个字符是否在‘0’-‘9’的范围内,即判断是否为数字
throw new GradeException("输入格式不合法");//抛出异常
}
}
//将String类型转换成int再判断大小是否符合成绩数值规定
int grades = Integer.parseInt(grade);//String类型数据转换成int类型
if (grades <0 || grades > 100){//判断数值是否在1-100内
throw new GradeException("成绩输入有误");//若不在则抛出异常
}
return a;//返回a
}
}