Java异常处理之⼿动抛出异常
⼀、⼿动抛出异常 throw
在编写程序时,我们必须要考虑程序出现问题的情况。⽐如,在定义⽅法时,⽅法需要接受参数。那么,当调⽤⽅法使⽤接受到的参数时,⾸先需要先对参数数据进⾏合法的判断,数据若不合法,就应该告诉调⽤者,传递合法的数据进来。这时需要使⽤抛出异常的⽅式来告诉调⽤者。
Java 异常类对象除在程序执⾏过程中出现异常时由系统⾃动⽣成并抛出,也可以根据需要使⽤⼈⼯创建并抛出。
在java中,提供了⼀个 throw 关键字,它⽤来抛出⼀个指定的异常对象。在当前⽅法中不处理,抛给调⽤者处理。
异常的对象的创建和抛出有两种⽅式:
(1)JVM 创建并抛出
(2)⼿动 new 出来,然后由 throw 抛出。
Throwable:
只有当对象是此类(或其⼦类之⼀)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
类似地,只有此类或其⼦类之⼀才可以是 catch ⼦句中的参数类型。
⼿动抛出异常对象:
(1)⾸先要⽣成异常类对象,然后通过 throw 语句实现抛出操作(提交给 Java 运⾏环境)
IOException e = new IOException();
throw e;
(2)可以抛出的异常必须是 Throwable 或其⼦类的实例。下⾯的语句在编译时将会产⽣语法错误:
throw new String("want to throw");
⼆、抛出异常
1、实现步骤
(1)创建⼀个异常对象。封装⼀些提⽰信息(信息可以⾃⼰编写)
(2)需要将这个异常对象告诉给调⽤者。通过关键字 throw 就可以完成。throw 异常对象。
throw 关键字作⽤:⽤在⽅法内,⽤来抛出⼀个异常对象,将这个异常对象传递到调⽤者处,并结束当前⽅法的执⾏。
使⽤格式:
throw new 异常类名("异常产⽣的原因");
注意:
(1)throw 关键字必须写在⽅法的内部
(2)throw 关键字后边 new 的对象必须是 Exception或者Exception的⼦类对象
(3)throw 关键字抛出指定的异常对象,我们就必须处理这个异常对象
throw 关键字后边创建的是RuntimeException或者是 RuntimeException的⼦类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)
throw 关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,
要么atch
2、throw 与 throws 区别
⾯试题:throw 与 throws 有什么区别?
(1)throw ⽤于⼿动抛出异常对象,是个可执⾏的语句
(2)throws:在⽅法签名中,声明⽅法可能抛出什么异常,让调⽤者来处理这些异常。
3、代码⽰例
1 // 主⽅法
2 public static void main(String[] args) {
3 //int[] arr = null;
4 int[] arr = new int[3];
5 int e = getElement(arr,3);
6 System.out.println(e);
7 }
8 // 定义⼀个⽅法,获取数组指定索引处的元素
9 public static int getElement(int[] arr,int index){
10 /*
11 我们可以对传递过来的参数数组,进⾏合法性校验
12 如果数组arr的值是null
13 那么我们就抛出空指针异常,告知⽅法的调⽤者"传递的数组的值是null"
14 */
15 if(arr == null){
16 throw new NullPointerException("传递的数组的值是null");
17 }
18
19 /*
20 我们可以对传递过来的参数index进⾏合法性校验
21 如果index的范围不在数组的索引范围内
22 那么我们就抛出数组索引越界异常,告知⽅法的调⽤者"传递的索引超出了数组的使⽤范围"
23 */
24 if(index<0 || index>arr.length-1){
25 /*
26 判断条件如果满⾜,当执⾏完throw抛出异常对象后,⽅法已经⽆法继续运算。
27 这时就会结束当前⽅法的执⾏,并将异常告知给调⽤者。这时就需要通过异常来解决。
28 */
29 throw new ArrayIndexOutOfBoundsException("传递的索引超出了数组的使⽤范围");
30 }
31
32 int ele = arr[index];
33 return ele;
34 }
35
注意:NullPointerException、ArrayIndexOutOfBoundsException 是⼀个运⾏期异常,我们不⽤处理,默认交给JVM处理。
Tips:如果产⽣了问题,我们就会throw将问题描述类即异常进⾏抛出,也就是将问题返回给该⽅法的调⽤者。对于调⽤者,有两种解决⽅式:⼀种是进⾏捕获处理,另⼀种就是继续将异常声明出去,使
⽤ throws 声明处理。
4、扩展:Objects ⾮空判断
Objects 是由⼀些静态的使⽤⽅法组成,这些⽅法是 null-save(空指针安全的)或 null-tolerant(容忍空指针的),那么在它的源码中,对对象的null 值进⾏了抛出异常操作。
public static <T> T requireNonNull(T obj) :查看指定引⽤对象不是null。
源码:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
这样,当我们需要对传递过来的参数进⾏合法判断,判断是否为 null的时候,可以直接使⽤该⽅法即可。
Demo:nullpointerexception为什么异常
1 public static void method(Object obj){
2 //对传递过来的参数进⾏合法性判断,判断是否为null
3 /*if(obj == null){
4 throw new NullPointerException("传递的对象的值是null");
5 }*/
6
7 //quireNonNull(obj);
8 quireNonNull(obj,"传递的对象的值是null"); // ⽅法重载
9 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论