20220729 第一组 于芮 异常处理(第二十天)
异常
异常处理
1.下标越界
2.空指针
3.类型转换异常
4.数字格式化
5.算术异常(数学异常)
异常的继承体系结构
throwable:错误,异常
error:正常情况下,不太可能出现。绝大多数error都会导致处于非正常状态下
很难恢复,外力的作用下,不考虑
exception:JAVA语言中,将程序执行中发生的不正常的情况称之为异常
编译期异常:写代码的时候,抛异常
运行期异常:runtimeexception 运行时会抛出异常
自定义异常:java中的异常机制,结合实际业务
如何自定义异常
1.所有异常必须是throwable的子类(不用)
2.如果要定义一个编译期异常,需要继承exception类
3.如果要定义一个运行期异常,需要继承runtimeexception
在一个语句块中,如果使用throw抛出一个编译期异常,就必须在方法的声明处使用throws关键字来标记异常类型
还有一种处理方式,就是直接try...catch
我们为什么要手动抛异常?
因为要配合全局异常处理机制来解决问题
throw语句是可以当做方法的返回值的。
在一个有返回值的方法中,如果有条件分支,一定要保证每种情况下都有返回值,哪怕是抛异常。
开发中,大部分情况下使用的都是运行期异常!!!
异常链
一个异常被抛出之后会继续被调用这个方法的方法捕获或抛出,异常会扩散
如果一个方法没有捕获编译器异常,该方法不需使用throws来声明
throws并不是真正的解决了异常,只是把异常抛给了下一级调用者。
throws出现在什么地方?
方法的声明处,抛出多个异常,用逗号隔开。
finally关键字
finally用来创建在try代码块后面执行放入代码块
无论是否发生异常,finally代码块中的代码一定会执行。一般finally中的代码都是用来释放资源。
重写的方法不能抛出比被重写方法更大的异常类型
try...catch..finally执行顺序:finally永远是在最后执行的
今天的实例是一个员工系统的升级版,里面利用抛出异常提示一些输入的不合法格式,来看一下代码吧!
1 package C0729; 2 3 import R0725.Queue; 4 5 import java.math.BigDecimal; 6 import java.time.LocalDate; 7 import java.util.Scanner; 8 9 public class Person { 10 private Queue queue=new Queue(); 11 private String empNo; 12 private String name; 13 private Integer age; 14 private String idCard; 15 private BigDecimal salay; 16 17 private Integer totalPeople; 18 private BigDecimal totalSalay; 19 private int startnumber=1001; 20 21 public Person() { 22 } 23 24 public String getIdCard() { 25 return idCard; 26 } 27 28 public void setIdCard(String idCard) { 29 this.idCard = idCard; 30 } 31 32 public String getName() { 33 return name; 34 } 35 36 public void setName(String name) { 37 this.name = name; 38 } 39 40 public BigDecimal getSalay() { 41 return salay; 42 } 43 44 public void setSalay(BigDecimal salay) { 45 this.salay = salay; 46 } 47 48 public String getEmpNo() { 49 return empNo; 50 } 51 52 public void setEmpNo(String empNo) { 53 this.empNo = empNo; 54 } 55 56 public Integer getAge() { 57 return age; 58 } 59 60 public void setAge(Integer age) { 61 this.age = age; 62 } 63 64 public Integer getTotalPeople() { 65 return totalPeople; 66 } 67 68 public void setTotalPeople(Integer totalPeople) { 69 this.totalPeople = totalPeople; 70 } 71 72 public BigDecimal getTotalSalay() { 73 return totalSalay; 74 } 75 76 public void setTotalSalay(BigDecimal totalSalay) { 77 this.totalSalay = totalSalay; 78 } 79 80 public int getStartnumber() { 81 return startnumber; 82 } 83 84 public void setStartnumber(int startnumber) { 85 this.startnumber = startnumber; 86 } 87 88 public Queue getQueue() { 89 return queue; 90 } 91 92 public void setQueue(Queue queue) { 93 this.queue = queue; 94 } 95 96 public Person(String empNo, String name, Integer age, String idCard) { 97 this.empNo = empNo; 98 this.name = name; 99 this.idCard=idCard; 100 if(genage(idCard)>=18){ 101 this.age = age; 102 }else{ 103 throw new RuntimeException("未成年!"); 104 } 105 if(genage(idCard)<=60){ 106 this.age=age; 107 }else{ 108 throw new RuntimeException("年龄过高"); 109 } 110 if(name!=null&&name!=""){ 111 this.name=name; 112 }else{ 113 throw new RuntimeException("姓名格式不合法"); 114 } 115 } 116 117 public Person(String empNo, String name, Integer age, String idCard, BigDecimal salay) { 118 this.empNo = empNo; 119 this.name = name; 120 this.age = age; 121 this.idCard = idCard; 122 this.salay = salay; 123 } 124 public void show(){ 125 System.out.println("编号"+startnumber+"姓名:"+name+"年龄:"+genage(idCard)+"生日:"+genBir(idCard)+"工资:"+salay); 126 } 127 public Integer showTotalPeople(){ 128 if(totalPeople==0){ 129 throw new RuntimeException("没有员工"); 130 } 131 return totalPeople; 132 } 133 public BigDecimal showTotalSalsy(){ 134 if(totalSalay.compareTo(new BigDecimal("0"))==0){ 135 throw new RuntimeException("没有工资"); 136 } 137 return totalSalay; 138 } 139 public void addSalay(BigDecimal salay){ 140 if(this.salay.add(salay).compareTo(totalSalay)==1){ 141 throw new RuntimeException("工资过高!"); 142 }else { 143 this.salay=this.salay.add(salay); 144 this.totalSalay=this.totalSalay.add(salay); 145 } 146 } 147 public Integer getTicket(){ 148 149 return queue.poll(); 150 } 151 public void pushTicket(int ticketNumber){ 152 for (int i = 0; i < ticketNumber; i++) { 153 startnumber+=1; 154 queue.add(startnumber); 155 156 } 157 } 158 public void subSalay(BigDecimal salay){ 159 if(this.totalSalay.subtract(salay).intValue()<1800){ 160 throw new RuntimeException("工资低于1800,不符合标准!"); 161 }else{ 162 this.salay=this.salay.subtract(salay); 163 this.totalSalay=this.totalSalay.subtract(salay); 164 } 165 } 166 public Integer genage(String idCard){ 167 String yearStr=this.getIdCard().substring(6,10); 168 int year=Integer.parseInt(yearStr); 169 int now= LocalDate.now().getYear(); 170 return now-year; 171 } 172 public String genBir(String idCard){ 173 String bir=this.getIdCard().substring(10,14); 174 StringBuilder stringBuilder=new StringBuilder(bir); 175 stringBuilder.insert(2,"月"); 176 stringBuilder.insert(5,"日"); 177 return stringBuilder.toString(); 178 } 179 180 181 }
1 package C0729; 2 3 import java.math.BigDecimal; 4 import java.util.Scanner; 5 6 public class Test { 7 public static void main(String[] args) { 8 Person person=new Person(); 9 Scanner in=new Scanner(System.in); 10 System.out.println("请输入姓名:"); 11 String name=in.next(); 12 person.getName(); 13 System.out.println("请输入身份证号:"); 14 String idCard=in.next(); 15 person.getIdCard(); 16 System.out.println("请输入工资:"); 17 BigDecimal salay1=in.nextBigDecimal(); 18 person.getSalay(); 19 person.getStartnumber(); 20 person.show(); 21 System.out.println("请选择:1.涨工资 \n2.降工资"); 22 int a=in.nextInt(); 23 System.out.println("请输入金额:"); 24 BigDecimal salay=in.nextBigDecimal(); 25 switch (a){ 26 case 1: 27 person.addSalay(salay); 28 break; 29 case 2: 30 person.subSalay(salay); 31 break; 32 } 33 person.showTotalPeople(); 34 person.showTotalSalsy(); 35 36 37 } 38 }