一、需求
需求:
键盘录入自己心仪的女朋友姓名和年龄。
姓名的长度在 3 - 10之间,
年龄的范围为 18 - 40岁,
超出这个范围是异常数据不能赋值,需要重新录入,一直录到正确为止。
提示:
需要考虑用户在键盘录入时的所有情况。
比如:录入年龄时超出范围,录入年龄时录入了abc等情况
写代码前,需要知道 抛出
和 捕获
的核心思想。
抛出
:告诉调用者出错了,因此抛出更多是写在方法里面。
捕获
:捕获更多的是写在方法的调用处,它的核心是让程序不要停止,程序能继续运行下去。
二、测试类
//1.创建键盘录入的对象
Scanner sc = new Scanner(System.in);
//2.创建女朋友的对象
GirlFriend gf = new GirlFriend();
//3.接收女朋友的姓名
System.out.println("请输入你心仪的女朋友的名字");
String name = sc.nextLine();
gf.setName(name);
System.out.println("请输入你心仪的女朋友的年龄");
String ageStr = sc.nextLine();
int age = Integer.parseInt(ageStr);
gf.setAge(age);
//5.打印
System.out.println(gf);
在上面代码中,如果年龄输入字符,是会报错的。
因此我们需要对这种情况进行处理,还需要对题目进行处理。
String ageStr = sc.nextLine();
// 办法一:我们在这里写if判断是没有问题的,但是当数据量比较多的时候,这种写法太过于繁琐
if (name.length() >= 3 && name.length() <= 10) {
gf.setName(name);
}
int age = Integer.parseInt(ageStr);
gf.setAge(age);
那该怎么办呢?在JavaBean中,有一个 set方法
,此时我们就可以将这些判断写在 set方法
里面了。
其实 set方法
的核心也是这样,它会对你传递过来的数据进行校验,满足要求才赋值,不满足要求直接pass不要。
抛出异常时,Java没有一个类能完美表示我们现在出的问题,此时就可以写 RuntimeException
,创建运行时异常的父类,这就可以了。
三、GirlFriend.java
在两个方法的后面都可以写 throws RuntimeException
,但是这个是可以省略的,因为 RuntimeException
是运行时期异常,运行时异常可以省略不写。
public void setName(String name) {
int len = name.length();
if(len < 3 || len > 10){
throw new RuntimeException();
}
this.name = name;
}
public void setAge(int age) {
if(age < 18 || age > 40){
throw new RuntimeException();
}
this.age = age;
}
接下来就要在测试类中处理异常信息。
如果不处理,就会交给虚拟机处理,它会将异常的信息打印在控制台,而且程序会停止。
这个不是我们想要的,我们想要的是:需要重新录入,一直录到正确为止。
因此这里的异常我们需要处理它。
//1.创建键盘录入的对象
Scanner sc = new Scanner(System.in);
//2.创建女朋友的对象
GirlFriend gf = new GirlFriend();
while (true) {
//3.接收女朋友的姓名
try {
// 输出语句放在try外面也是没问题的,但是为了保证代码的结构性,放里面也是ok的
System.out.println("请输入你心仪的女朋友的名字");
String name = sc.nextLine();
gf.setName(name);
//4.接收女朋友的年龄
System.out.println("请输入你心仪的女朋友的年龄");
// 这里不用nextInt()是因为如果它输入字符就会报错
// 所以此时采取nextLine(),不管你录什么哪怕录的是abc,先录入到系统中,然后再来进行转换 / 判断,如果有问题,再让你重新录就行了
String ageStr = sc.nextLine();
int age = Integer.parseInt(ageStr);
gf.setAge(age);
//如果所有的数据都是正确的,那么跳出循环
break;
} catch (NumberFormatException e) {
System.out.println("年龄的格式有误,请输入数字");
//这里continue可写可不写,因为就算你不写,它下面也没有其他代码了
//continue;
} catch (RuntimeException e) {
System.out.println("姓名的长度或者年龄的范围有误");
//continue;
}
}
//5.打印
System.out.println(gf);