- 处理异常,让含受检异常(checked Exception)的程序可以运行完成。个人觉得学完后,通过自己编几题,可以巩固一下知识,也可以测试一下这方面熟不熟悉吧。
先复习一下异常用到的几个关键字:
1. try:检测可能出现异常的代码块,如果出现异常就将其抛出
2. catch:用于捕获异常,捕获try抛出来的异常
3. finally:不管有无异常都会执行的语句块,一般用于回收try中所使用的资源。但需要注意是,当try语句块中抛出了异常,catch没有捕捉处理,就会交给JVM处理,但这样的话finally语句块执行后,在finally外的语句块不会被执行
4. throw:用于抛出异常
5. throws:用在方法定义时,(放方法参数括号的后面)用于声明该方法可能抛出的异常,就是在方法体内抛出的异常对象如果和throws后异常类相匹配的话,就会被它接受放表内,然后调用该方法时异常对象就会被抛出,和throws所供异常类不符的话就会向上抛出
题目:
一个小工厂处理员工工资问题。工厂有员工人数,以及老板能承受给出的最高薪水和员工要求的最低薪水。
员工有姓名,年龄,⼯资,⾝份证号码等代表自身身份的属性。小工厂内有减工资和升工资措施,当工资小于最小薪水时会发生异常给予提醒小工厂老板,当工资大于最大老板能给予的薪水时也会给出异常提醒小工厂老板。
当然小工厂没员工也会发现异常(就是工厂员工人数为0),还有员工的一些信息错误也会异常,比如身份证号错误(身份证号应有十八位),年龄不符合工作条件(年龄需满十八岁且不能高于60岁)
阅读完题目,我们可以总结出我们需要完成的异常类有:空异常,年龄异常,工资异常,身份证非法异常。
如图所示:
根据画的图可以清楚的了解直接继承的关系,然后编写所需的异常类:
//定义空异常类
class nullException extends Exception{
private String message;
public nullException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
//定义年龄异常类
class AgeException extends Exception{
private String message;
public AgeException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
//定义薪水异常类
class SalaryException extends Exception{
private String message;
public SalaryException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
//定义身份证异常类
class IDcardException extends Exception{
private String message;
public IDcardException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
定义完可能出现的异常类,那么现在就可以构建小工厂类和员工类了:
//定义小工厂类
class smallFactory{
public static int number; //厂内人数
public static int minSalary;
public static int maxSalary;
static {
number = 10;
minSalary = 600;
maxSalary = 100000;
}
public smallFactory() {
}
//方便修改最低最高薪水
public smallFactory(int minSalary,int maxSalary) {
this.minSalary = minSalary;
this.maxSalary = maxSalary;
}
}
//定义员工类
class Employee extends smallFactory{
private String name; //员工姓名
private int Age; //员工年龄
public int Salary; //员工起始工资,不包含加薪和降薪后的工资(加薪降薪有些人有有些人没有)
private String idCard; //员工身份证号
}
(薪水后续可能要改变,可能要被外界访问,所以就设为public访问权限)
定义完属性后,现在可以构造可能发生的异常了,我们可以用throws关键字在员工类的构造函数中进行实现,然后再在员工类中添加两个方法,一个加薪,一个降薪。
写好后员工类的代码如下:
//定义员工类
class Employee extends smallFactory{
private String name; //员工姓名
private int Age; //员工年龄
public int Salary; //员工起始工资,不包含加薪和降薪后的工资(加薪降薪有些人有有些人没有)
private String idCard; //员工身份证号
public Employee(int Age,int Salary,String idCard) throws Exception{
//可能出现的年龄异常
if(Age<18) {
System.out.println("还是先去读书吧,小小年纪别想着进厂");
throw new AgeException("年龄小了!");
}
else if(Age>60)
throw new AgeException("年龄太大了!");
//可能出现的薪水异常
this.Salary = Salary;
if(Salary<smallFactory.minSalary)
throw new SalaryException("工资也忒少了吧!");
else if(Salary>smallFactory.maxSalary) {
System.out.println("想屁吃呢?想拿这么高工资!");
throw new SalaryException("工资太高了,应该统计错了");
}
//可能出现的身份证非法异常
if(idCard.length()!=18)
throw new IDcardException("身份证号非法异常");
}
//添加个加薪方法
public void addSalary(int addSalaryNum)throws Exception {
Salary = Salary+addSalaryNum;
if(Salary<smallFactory.minSalary)
throw new SalaryException("加了钱还这么少啊");
else if(Salary>smallFactory.maxSalary) {
System.out.println("想屁吃呢?想拿这么高工资!");
throw new SalaryException("工厂付不起这工资");
}
}
//添加个降薪方法
public void cutSalary(int cutSalaryNum)throws Exception{
Salary = Salary-cutSalaryNum;
if(Salary<smallFactory.minSalary)
throw new SalaryException("活该这么点工资");
if(Salary>smallFactory.maxSalary)
throw new SalaryException("降工资还这么高,应该算错了");
}
}
最后我们在主函数内进行测试,看是否有异常,有的话进行捕获和解决,没的话输出该厂这名员工的这些信息。(那个抛出异常对象的那个信息是我自己写的,自己可以写认为看得顺眼的异常产生信息)
总代码如下:
import java.util. *;
//定义空异常类
class nullException extends Exception{
private String message;
public nullException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
//定义年龄异常类
class AgeException extends Exception{
private String message;
public AgeException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
//定义薪水异常类
class SalaryException extends Exception{
private String message;
public SalaryException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
//定义身份证异常类
class IDcardException extends Exception{
private String message;
public IDcardException(String message) {
this.message = message;
}
public String getmessage() {
return message;
}
}
//定义小工厂类
class smallFactory{
public static int number; //厂内人数
public static int minSalary;
public static int maxSalary;
static {
number = 10;
minSalary = 600;
maxSalary = 100000;
}
public smallFactory() {
}
//方便修改最低最高薪水
public smallFactory(int minSalary,int maxSalary) {
this.minSalary = minSalary;
this.maxSalary = maxSalary;
}
}
//定义员工类
class Employee extends smallFactory{
private String name; //员工姓名
private int Age; //员工年龄
public int Salary; //员工起始工资,不包含加薪和降薪后的工资(加薪降薪有些人有有些人没有)
private String idCard; //员工身份证号
public Employee(int Age,int Salary,String idCard) throws Exception{
//可能出现的年龄异常
if(Age<18) {
System.out.println("还是先去读书吧,小小年纪别想着进厂");
throw new AgeException("年龄小了!");
}
else if(Age>60)
throw new AgeException("年龄太大了!");
//可能出现的薪水异常
this.Salary = Salary;
if(Salary<smallFactory.minSalary)
throw new SalaryException("工资也忒少了吧!");
else if(Salary>smallFactory.maxSalary) {
System.out.println("想屁吃呢?想拿这么高工资!");
throw new SalaryException("工资太高了,应该统计错了");
}
//可能出现的身份证非法异常
if(idCard.length()!=18)
throw new IDcardException("身份证号非法异常");
}
//添加个加薪方法
public void addSalary(int addSalaryNum)throws Exception {
Salary = Salary+addSalaryNum;
if(Salary<smallFactory.minSalary)
throw new SalaryException("加了钱还这么少啊");
else if(Salary>smallFactory.maxSalary) {
System.out.println("想屁吃呢?想拿这么高工资!");
throw new SalaryException("工厂付不起这工资");
}
}
//添加个降薪方法
public void cutSalary(int cutSalaryNum)throws Exception{
Salary = Salary-cutSalaryNum;
if(Salary<smallFactory.minSalary)
throw new SalaryException("活该这么点工资");
if(Salary>smallFactory.maxSalary)
throw new SalaryException("降工资还这么高,应该算错了");
}
}
public class Solution{
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
String _name = reader.next();
int _Age = reader.nextInt();
String _idCard = reader.next();
int _Salary = reader.nextInt();
try {
Employee human = new Employee(_Age,_Salary,_idCard);
//上面如果没有发生异常的话,对有加薪降薪的人进行操作
/*int addSalaryNum = reader.nextInt();
human.addSalary(addSalaryNum);*/
/*int cutSalaryNum = reader.nextInt();
human.cutSalary(cutSalaryNum);*/
//都没有异常的话,就打印该人的信息
System.out.print("姓名\t年龄\t身份证号\t\t\t薪水\n");
System.out.print(_name + '\t' + _Age + '\t' + _idCard + '\t' + human.Salary + '\n');
}
catch(Exception e) {
//获取有关异常的信息
e.printStackTrace();
}
}
}
测试几条自己想测试的案例会发现,方法体内有一个异常对象被抛出的话,那么它后续的代码都不会被执行。
相信如果你自己单独写完这题会有收获的。