• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

lzsykal

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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();
    }
}

posted on 2022-07-29 23:12  林钟朔一  阅读(28)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3