20220729 第六组 张嘉源 学习笔记
异常
Throwable
最顶级的Throwable:错误,异常
Error
Error:正常情况下,不太可能出现,绝大多数Error都会导致程序处于一个非正常的状态下, 基本上很难恢复。在外力的作用下,不考虑。Error是Throwable的子类,它是在Java 程序处理范围之外的
Exception
Exception:在Java语言中,将程序执行中发生的不正常的情况称之为异常。Exception也是 Throwable的子类。
编译期异常
编译期异常:写代码的时候,抛异常。如果编译器不解决,会编译不通过
运行期异常
运行期异常:RuntimeException,运行时会抛异常,平时没事
开发中,大部分情况下使用的都是运行期异常
自定义异常
1.所有的异常必须是Throwable的子类(大材小用,没必要)
2.如果要定义一个编译期异常,需要继承Exception类
3.如果要定义一个运行期异常,需要继承RuntimeException类
throw
在一个语句块中,如果使用throw抛出一个编译期异常,就必须在方法的声明处使用throws关键字来标记异常类型。
throw语句是可以当做方法的返回值的
在一个有返回值的方法中,如果有条件分支,一定要保证每种情况下都有返回值,哪怕是抛异常。
try...catch
还有一种处理方式,直接try ... catch
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
异常链
一个异常被抛出去之后会继续被调用这个方法的方法捕获或抛出,异常会扩散
只要说解决异常、处理异常、捕获异常就是try ... catch
throws
如果一个方法没有捕获一个编译期异常,该方法必须使用throws来声明
(1)在方法里直接try ... catch解决
点击查看代码
</details>`public void info(){
try{
show();
}catch(MyException e){
e.printStackTrace();
}
}
(2)在方法里抛异常给主函数,在主函数里try ... catch解决
点击查看代码
</details>
public void show()throws Exception{
}
public void info() throws Exception{
show();
}
public static voidmain(tring[] args){
try{
new Ch06().info();
}catch(Exception e){
e.printStackTrace();
}
}
规定:主方法里不允许继续往下抛异常
throws并不是真正的解决了异常,只是把异常抛给了下一级调用者。
throw和throws的区别
throws出现在方法的声明处,可以抛出多个异常(用逗号隔开)
*finally关键字:*
finally用来创建在try代码块后面执行的代码块
无论是否发生异常,finally代码块中的代码一定会执行。一班finally中的代码都是用来释放资源的。
Finally无论是否出现异常,都会执行
try ... catch、finally执行顺序
finally永远是在最后执行的
如果在try ... catch语句中有return
*atch可以写多个异常(可以捕获多个异常)*
顺序问题:先写小的,再写大的
重写的另一个规则:*重写的方法不能抛出比被重写方法更大的异常类型*
需求
员工类:属性 编号 姓名 工资 年龄身份证号 员工人数 工资总额
构造器:编号 姓名 年龄 年龄小于18,抛出年龄异常(年龄通过身份证号算出来):年龄大于60,抛出年龄异常
如果姓名为nulL或"",抛出空异常
设置工资,设置身份证号,如果工资低于1800,抛出工资低异常
方法:涨工资addSalary ()
涨完工资高过工资总额抛出工资过高异常
降工资subSalary()降完工资低于1800,抛出工资低异常
显示员工工资总额的方法,如果总额是0,抛出空异常
显示员工人数,当员工人数为0时,抛出空异常
显示员工信息:编号姓名 年龄 工资 生日(通过身份证号算出来)
自定义异常:年龄高异常,年龄低异常,工资低异常,工资高异常,身份证号非法异常
代码
Employee类
点击查看代码
import java.math.BigDecimal;
import java.time.LocalDate;
public class Employee{
private String name;
private String nos="1000";
private static Integer temp=0;
private BigDecimal salary;
private Integer age;
private String ID;
private Integer employeeNum;
private static BigDecimal grossPayroll=new BigDecimal(1000);
public Employee(){
}
public Employee(String name,Integer age,String ID,BigDecimal salary) {
idCard(ID);
myException.ageException(getAge(ID));
this.name=name;
this.age=age;
this.ID = ID;
this.salary=salary;
// 判断姓名
try {
if(name==null){
throw new RuntimeException("姓名不能为空!");
}
}catch (Exception e){
e.printStackTrace();
}
// 总工资
grossPayroll=grossPayroll.add(salary);
// System.out.println(grossPayroll);
// 编号自增
temp++;
int a=Integer.parseInt(nos)+temp;
nos=Integer.toString(a);
}
public BigDecimal getSalary() {
return salary;
}
// public void setSalary(BigDecimal salary) {
// this.salary = salary;
// }
// public BigDecimal getGrossPayroll() {
// return grossPayroll;
// }
//
// public void setGrossPayroll(BigDecimal grossPayroll) {
// this.grossPayroll = grossPayroll;
// }
// 涨工资(工资涨到add)
public BigDecimal addSalary(BigDecimal add){
salaryException(add);
grossPayroll=grossPayroll.add(add.subtract(salary));
salary=add;
return salary;
}
// 降工资(工资降到sub)
public BigDecimal subSalary(BigDecimal sub){
salaryException1(sub);
grossPayroll=grossPayroll.subtract(salary.subtract(sub));
salary=sub;
return salary;
}
// 判断身份证号
public void idCard(String ID){
if (!ID.matches("([1-9][0-9]{5}(18|19|20)[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}[0-9Xx])|([1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3})") ){
}
}
// 判断员工工资总额是否为0
public BigDecimal showGrossPayroll(){
if (grossPayroll.compareTo(new BigDecimal("0"))==0){
throw new RuntimeException();
}
return grossPayroll;
}
// 判断员工人数是否为0
public Integer showEmployeeNum(){
if (employeeNum==0){
throw new RuntimeException("异常!");
}
return employeeNum;
}
// 计算年龄
public static Integer getAge(String ID){
String yearStr=ID.substring(6,10);
int year=Integer.parseInt(yearStr);
int now= LocalDate.now().getYear();
return now-year;
}
// 计算生日
public static String getBir(String ID){
String bir = ID.substring(10, 14);
StringBuilder stringBuilder = new StringBuilder(bir);
stringBuilder.insert(2,"月");
stringBuilder.insert(5,"日");
return stringBuilder.toString();
}
// 显示员工信息
public void show(){
System.out.println("姓名:"+name+" 年龄:"+getAge(ID)+" 生日:"+getBir(ID)+" 编号:"+nos);
}
public void salaryException(BigDecimal add){
if (add.subtract(salary).compareTo(grossPayroll)==1){
throw new RuntimeException("工资超出范围!");
}
}
public void salaryException1(BigDecimal sub){
if (new BigDecimal(1800).compareTo(sub)==1){
throw new RuntimeException("工资超出范围!");
}
}
}
myException类
点击查看代码
public class myException extends Exception{
public myException(){
}
public myException(String e){
super(e);
}
public static void ageException(Integer age){
if (age<18){
throw new RuntimeException("年龄过小!");
} else if (age>60) {
throw new RuntimeException("年龄过大!");
}
}
}
Demo
点击查看代码
public class Demo{
public static void main(String[] args) {
Employee employee = new Employee("张三",20,"220422200406230039",new BigDecimal(2000));
// System.out.println("总工资为:"+employee.getSalary());
employee.show();
// System.out.println(employee.subSalary(new BigDecimal(1700)));
// System.out.println(employee.addSalary(new BigDecimal(8000)));
// Employee employee1 = new Employee("李四",20,"220422200306230039",new BigDecimal(2000));
// employee1.show();
}
}
浙公网安备 33010602011771号