今日重点:
目录
一、异常处理
1、异常处理的概念
2、 异常的继承体系结构
(1)Error
(2)Exception:
(3)RuntimeException及其子类:
(4)除了RuntimeException之外所有的异常:
3、编译期异常和运行期异常
编辑
(1)编译期异常:
(2)运行期异常:
(3)其他会出错的情况
4、异常处理机制
(1)异常默认处理机制
(2)根据已知的错误情况进行相对应的处理
(3)捕获异常
自定义异常
(3)自定义异常:
(4) 怎么自定义异常?
6、异常链
课上案例:
一、异常处理
1、异常处理的概念
异常是代码在编译或者执行的过程中可能出现的错误。学习异常处理的目的是为了避免异常的出现,同时处理可能出现的异常让代码更加完善实用。异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
异常发生的原因有很多,通常包含以下几大类:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
2、 异常的继承体系结构
异常是代码在编译或者执行的过程中可能出现的错误。学习异常处理的目的是为了避免异常的出现,同时处理可能出现的异常让代码更加完善实用。异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
异常发生的原因有很多,通常包含以下几大类:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-
2、 异常的继承体系结构
(1)Error
①系统级别问题,JVM退出等,代码无法控制。代码正常情况下,不太可能出现的。绝大多数Error都会导致程序处于非正常的状态下,很难恢复,外力作用下,不考虑。Error是Throwable的子类,它是在Java程序处理范围1之外的。
(2)Exception:
Java语言中,将程序执行中发生的不正常的情况称之为异常,java.lang包下,成为异常类,它表示程序本身可以处理的问题。
(3)RuntimeException及其子类:
运行时异常,编译阶段不会报错。比如空指针异常,数组索引越界异常
(4)除了RuntimeException之外所有的异常:
编译时异常,编译期必须处理的,否则程序不能通过编译。比如日期格式化异常
3、编译期异常和运行期异常
(1)编译期异常:
没有继承RuntimeException的异常,继承自Exception的异常或者其子类。编译阶段就会报错。写代码的时候,抛异常。就算代码没有出错,但是结果就会提示有异常。是Java系统担心程序员的技术不行,在编译阶段就爆出一 个个错误, 目的在 于善意提醒,提醒程序员这里很可能出错,请检查并注意不要出bug,编译时异常是可遇不可求。如果编译器不解决,会编译不通过,会一直报错。
(2)运行期异常:
继承RuntimeException的异常或其子类,编译阶段不报错,运行时可能会抛出异常。运行期异常一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误。
运行时异常示例
●数组索引越界异常: ArrayIndexOutOfBoundsException
●空指针异常 : NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
●数学操作异常: ArithmeticException
●类型转换异常: ClassCastException
●数字转换异常 : NumberFormatException
(3)其他会出错的情况
①除数为0
②IO流,没有关闭
电脑会容易蓝屏
③停电
数据没来得及保存就停电就会流失
4、异常处理机制
当一个程序抛出异常(发生错误)时,抛出异常后面的语句不再执行,类似于return的功能
(1)异常默认处理机制
①默认会在出现异常的代码那里自动的创建一个异 常对象: ArithmeticException。
②异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
③虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
④直接从当前执行的异常点干掉当前程序。
⑤后续代码没有机会执行了,因为程序已经死亡。
(2)根据已知的错误情况进行相对应的处理
package com.jr.morning;
public class Ch01 {
public static void main(String[] args) {
int n1=10;
int n2=0;
if (n2 !=0){
System.out.println(n1/n2);
}
System.out.println("非常重要我一定要输出");
}
}
但是在现实中我们并不能知 道具体会发生什么错误,这是一个最笨的方法。
(3)捕获异常
package com.jr.morning;
public class Ch02 {
public static void main(String[] args) {
int n1 = 10;
int n2 = 0;
try {//把有可能抛出异常的代码放到try语句块里
System.out.println(n1 / n2);
} catch (Exception e) {
System.out.println("除数不能为0");
e.printStackTrace();
}
System.out.println("非常重要我一定要输出");
}
}
自定义异常
(3)自定义异常:
Java中异常机制,但是得结合实际业务
(4) 怎么自定义异常?
①所有异常必须是Throwable的子类(大材小用,没必要).
②如果要定义一个编译期异常,需要继承Exception类。
③如果要定义一个运行期异常,需要继承RuntimeException类。
package com.jr.morning;
public class Ch03 {
public static void fun(int i,int j){
if (j==0){
throw new MyRuntimeException("除数不能为0");
}
//做除法运算
System.out.println(i/j);
}
public static void main(String[] args) {
fun(1,0);
}
}
运行结果
抛出异常
6、异常链
Ch05一个异常被抛出去之后会继续被调用这个的方法捕获或者抛出,异常会扩展
课上案例:
需求:
创建一个员工类:
属性:
编号,姓名,年龄,工资,身份证号,员工人数,工资总额
构造器:
1.编号,年龄,姓名。如果年龄小于18,抛出年龄低异常;
如果年龄大于60,抛出年龄高异常,如果姓名为null或"",抛出空异常
(ps:年龄是通过身份证号算出来的。)
2.设置工资,设置身份证号;如果工资低于1800,抛出功能工资低异常。
方法:
1.涨工资addsalary()钱? ? ?涨完工资高过工资总额,抛出工资过高异常
2.降工资subSalary(), 降完工资如果低于1800, 抛出工资低异常
3.显示员工工资总额的方法,如果总额是0,抛出空异常
4.显示员工人数;当员工人数为时,抛出空异常。
5.自定义异常:
6.空异常,年龄低异常,年龄高异常,工资低异常,工资高异常,身份证号非法异常
7.键盘输入,全用String。
(1)编译期异常:
没有继承RuntimeException的异常,继承自Exception的异常或者其子类。编译阶段就会报错。写代码的时候,抛异常。就算代码没有出错,但是结果就会提示有异常。是Java系统担心程序员的技术不行,在编译阶段就爆出一 个个错误, 目的在 于善意提醒,提醒程序员这里很可能出错,请检查并注意不要出bug,编译时异常是可遇不可求。如果编译器不解决,会编译不通过,会一直报错。
(2)运行期异常:
继承RuntimeException的异常或其子类,编译阶段不报错,运行时可能会抛出异常。运行期异常一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误。
运行时异常示例
●数组索引越界异常: ArrayIndexOutOfBoundsException
●空指针异常 : NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
●数学操作异常: ArithmeticException
●类型转换异常: ClassCastException
●数字转换异常 : NumberFormatException
(3)其他会出错的情况
①除数为0
②IO流,没有关闭
电脑会容易蓝屏
③停电
数据没来得及保存就停电就会流失
当一个程序抛出异常(发生错误)时,抛出异常后面的语句不再执行,类似于return的功能
(1)异常默认处理机制
①默认会在出现异常的代码那里自动的创建一个异 常对象: ArithmeticException。
②异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
③虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
④直接从当前执行的异常点干掉当前程序。
⑤后续代码没有机会执行了,因为程序已经死亡。(2)根据已知的错误情况进行相对应的处理
package com.jr.morning; public class Ch01 { public static void main(String[] args) { int n1=10; int n2=0; if (n2 !=0){ System.out.println(n1/n2); } System.out.println("非常重要我一定要输出"); } }但是在现实中我们并不能知 道具体会发生什么错误,这是一个最笨的方法。
(3)捕获异常
package com.jr.morning; public class Ch02 { public static void main(String[] args) { int n1 = 10; int n2 = 0; try {//把有可能抛出异常的代码放到try语句块里 System.out.println(n1 / n2); } catch (Exception e) { System.out.println("除数不能为0"); e.printStackTrace(); } System.out.println("非常重要我一定要输出"); } }
自定义异常
(3)自定义异常:
Java中异常机制,但是得结合实际业务
(4) 怎么自定义异常?
①所有异常必须是Throwable的子类(大材小用,没必要).
②如果要定义一个编译期异常,需要继承Exception类。
③如果要定义一个运行期异常,需要继承RuntimeException类。
package com.jr.morning;
public class Ch03 {
public static void fun(int i,int j){
if (j==0){
throw new MyRuntimeException("除数不能为0");
}
//做除法运算
System.out.println(i/j);
}
public static void main(String[] args) {
fun(1,0);
}
}
运行结果
抛出异常
6、异常链
Ch05一个异常被抛出去之后会继续被调用这个的方法捕获或者抛出,异常会扩展
课上案例:
需求:
创建一个员工类:
属性:
编号,姓名,年龄,工资,身份证号,员工人数,工资总额
构造器:
1.编号,年龄,姓名。如果年龄小于18,抛出年龄低异常;
如果年龄大于60,抛出年龄高异常,如果姓名为null或"",抛出空异常
(ps:年龄是通过身份证号算出来的。)
2.设置工资,设置身份证号;如果工资低于1800,抛出功能工资低异常。
方法:
1.涨工资addsalary()钱? ? ?涨完工资高过工资总额,抛出工资过高异常
2.降工资subSalary(), 降完工资如果低于1800, 抛出工资低异常
3.显示员工工资总额的方法,如果总额是0,抛出空异常
4.显示员工人数;当员工人数为时,抛出空异常。
5.自定义异常:
6.空异常,年龄低异常,年龄高异常,工资低异常,工资高异常,身份证号非法异常
7.键盘输入,全用String。
(3)自定义异常:
Java中异常机制,但是得结合实际业务
(4) 怎么自定义异常?
①所有异常必须是Throwable的子类(大材小用,没必要).
②如果要定义一个编译期异常,需要继承Exception类。
③如果要定义一个运行期异常,需要继承RuntimeException类。
package com.jr.morning;
public class Ch03 {
public static void fun(int i,int j){
if (j==0){
throw new MyRuntimeException("除数不能为0");
}
//做除法运算
System.out.println(i/j);
}
public static void main(String[] args) {
fun(1,0);
}
}
运行结果
抛出异常
6、异常链
Ch05一个异常被抛出去之后会继续被调用这个的方法捕获或者抛出,异常会扩展
课上案例:
需求:
创建一个员工类:
属性:
编号,姓名,年龄,工资,身份证号,员工人数,工资总额
构造器:
1.编号,年龄,姓名。如果年龄小于18,抛出年龄低异常;
如果年龄大于60,抛出年龄高异常,如果姓名为null或"",抛出空异常
(ps:年龄是通过身份证号算出来的。)
2.设置工资,设置身份证号;如果工资低于1800,抛出功能工资低异常。
方法:
1.涨工资addsalary()钱? ? ?涨完工资高过工资总额,抛出工资过高异常
2.降工资subSalary(), 降完工资如果低于1800, 抛出工资低异常
3.显示员工工资总额的方法,如果总额是0,抛出空异常
4.显示员工人数;当员工人数为时,抛出空异常。
5.自定义异常:
6.空异常,年龄低异常,年龄高异常,工资低异常,工资高异常,身份证号非法异常
7.键盘输入,全用String。
Ch05一个异常被抛出去之后会继续被调用这个的方法捕获或者抛出,异常会扩展
需求:
创建一个员工类:
属性:
编号,姓名,年龄,工资,身份证号,员工人数,工资总额
构造器:
1.编号,年龄,姓名。如果年龄小于18,抛出年龄低异常;
如果年龄大于60,抛出年龄高异常,如果姓名为null或"",抛出空异常(ps:年龄是通过身份证号算出来的。)
2.设置工资,设置身份证号;如果工资低于1800,抛出功能工资低异常。
方法:1.涨工资addsalary()钱? ? ?涨完工资高过工资总额,抛出工资过高异常
2.降工资subSalary(), 降完工资如果低于1800, 抛出工资低异常
3.显示员工工资总额的方法,如果总额是0,抛出空异常
4.显示员工人数;当员工人数为时,抛出空异常。5.自定义异常:
6.空异常,年龄低异常,年龄高异常,工资低异常,工资高异常,身份证号非法异常
7.键盘输入,全用String。



