异常体系总结

异常体系

在这里插入图片描述
编译时异常和运行时异常的区别编译时异常
编译时异常
-都是Exception类及其子类
-必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常
-都是RuntimeException类及其子类
- 无需显示处理,也可以和编译时异常一样处理

在这里插入图片描述

JVM默认处理异常

如果程序出现了问题,我们没有做任何处理,JVM会做默认处理
- 把异常的名称,错误原因及异常出现的位置等信息输出在控制台
- 把程序停止

throw方式处理异常

定义格式

public void 方法() throws 异常名{
}

示例代码

public class Exception{
public static void main(String[] args) throws ParseException{
System.out.println("开始");
method();
method2();
System.out.println("结束");
}
//编译时异常
public static void method2() thorws ParseException{
String s = "2048-08-09";
SimpleDateFormate sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);

}
//运行时异常
public static void method() throws ArrayIndexOutOfBoundsException{
int[] arr = {1,2,3};
System.out.println(arr[3]);

}

}

注意事项
- 这个throws格式是跟在方法的括号后边的
- 编译时异常必须进行处理,try…catch或者throws,如果采用throws这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理
- 运行时异常因为在运行时才会发生,所以在方法后边可以不写,运行时出现异常默认交给JVM处理.

throw 抛出异常

格式
throw new 异常();
注意
这个格式在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了
thorws和throw的区别
在这里插入图片描述
示例代码

public class ExceptionDemo8 {
public static void main(String[] args) {
//int [] arr = {1,2,3,4,5};
int [] arr = null;
printArr(arr);//就会 接收到一个异常.
//我们还需要自己处理一下异常.
}
private static void printArr(int[] arr) {
if(arr == null){
//调用者知道成功打印了吗?
//System.out.println("参数不能为null");
throw new NullPointerException(); //当参数为null的时候
//手动创建了一个异常对象,抛给了调用者,产生了一个异常
}else{
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
}

try-catch方式处理异常

定义格式

try{可能出现异常代码;
}
catch(异常类名 变量名){
异常处理代码}

执行流程
- 程序从try里边的代码开始执行
- 出现异常,就会跳转到对应的catch里面去执行
- 执行完毕后,程序还可以继续执行下去
示例代码

public class ExceptionDemo01 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("你访问的数组索引不存在,请回去修改为正确的索引");
}
}
}

注意
1.如果try中没有遇到问题,怎么执行?
会把try中所有的代码全部执行完毕,不会执行catch里边代码
2.如果try中遇到了问题,那么try下面的代码还会执行吗?
那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了,当catch里边的语句全部执行完毕,表示整个体系全部执行完毕,继续执行下边的代码
3. 如果出现的问题没有被捕获,那么程序如何运行?
那么try…catch就相当于没有写.那么也就是自己没有处理. 默认交给虚拟机处理.
4. 同时有可能出现多个异常怎么处理?
出现多个异常,那么就写多个catch就可以了. 注意点:如果多个异常之间存在子父类关系.那么父类一定要
写在下面

Throwable成员方法

在这里插入图片描述

public class ExceptionDemo02 {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]); //new ArrayIndexOutOfBoundsException();
System.out.println("这里能够访问到吗");
} catch (ArrayIndexOutOfBoundsException e) { //new
ArrayIndexOutOfBoundsException();
// e.printStackTrace();
//public String getMessage():返回此 throwable 的详细消息字符串
// System.out.println(e.getMessage());
//Index 3 out of bounds for length 3
//public String toString():返回此可抛出的简短描述
// System.out.println(e.toString());
//java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
//public void printStackTrace():把异常的错误信息输出在控制台
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// at com.itheima_02.ExceptionDemo02.method(ExceptionDemo02.java:18)
// at com.itheima_02.ExceptionDemo02.main(ExceptionDemo02.java:11)
}
}
}

自定义异常

实现步骤
1.定义异常类
2.写继承关系
3.提供空参构造
提供带参构造

public class AgeOutOfBoundsException extends RuntimeException {
public AgeOutOfBoundsException() {
}
public AgeOutOfBoundsException(String message) {
super(message);
}
}

Optional

获取对象
optional概述
可能包含或不包含非null值得容器对象
方法介绍
在这里插入图片描述

public class OptionalDemo1 {
public static void main(String[] args) {
//method1();
//public static <T> Optional<T> ofNullable(T value)
//获取一个Optional对象,Optional封装的值对象可以是null也可以不是null
//Student s = new Student("zhangsan",23);
Student s = null;
//ofNullable方法,封装的对象可以是null,也可以不是null。
Optional<Student> optional = Optional.ofNullable(s);
System.out.println(optional);
}
private static void method1() {
//static <T> Optional<T> of(T value) 获取一个Optional对象,封装的是非null值的对象
//Student s = new Student("zhangsan",23);
Student s = null;
//Optional可以看做是一个容器,里面装了一个引用数据类型的对象。
//返回值就是Optional的对象
//如果使用of方法,封装的对象如果为空,那么还是会抛出空指针异常
Optional<Student> optional1 = Optional.of(s);
System.out.println(optional1);
}
}

在这里插入图片描述

public class OptionalDemo2 {
public static void main(String[] args) {
//get() 如果存在值,返回值,否则抛出NoSuchElementException
//public boolean isPresent() 判断Optional所封装的对象是否不为空,如果不为空返回true
, 否则返回false
//Student s = new Student("zhangsan",23);
Student s = null;
Optional<Student> optional = Optional.ofNullable(s);
//如果封装的是一个null,那么通过get方法再次获取会抛出NoSuchElementException。
if(optional.isPresent()){
Student student = optional.get();
System.out.println(student);
}else{
System.out.println("Optional封装的对象为空");
}
}
}

处理空指针方法

在这里插入图片描述

异常类型

NullPointerException:空指针异常。
当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度等等。
ArrayIndexOutOfBoundsException:数组索引越界异常。
当对数组的索引值为负数或大于等于数组大小时抛出此异常。
ArithmeticException:算术运算异常。
程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
NumberFormatException:数字格式异常。
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值