异常

异常分类

java.lang.Throwable:类是 Java 语言中所有错误或异常的超类。

Exception:编译期异常,进行编译(写代码)java程序出现的问题

RuntimeException:运行期异常,java程序运行过程中出现的问题

异常就相当于程序得了一个小毛病(感冒,发烧),把异常处理掉,程序可以继续执行(吃点药,继续革命工作)

Error:错误

错误就相当于程序得了一个无法治愈的毛病(非典,艾滋).必须修改源代码,程序才能继续执行

 

异常产生过程的解析

异常的产生过程解析(分析异常的怎么产生的,如何处理异常)

*/

public class Demo02Exception {

public static void main(String[] args) {

//创建int类型的数组,并赋值

int[] arr = {1,2,3};

int e = getElement(arr,3);

System.out.println(e);

}

 

/*

定义一个方法,获取数组指定索引处的元素

参数:

int[] arr

int index

*/

public static int getElement(int[] arr,int index){

int ele = arr[index];

return ele;

}

}

 

 

throw关键字

作用:

可以使用throw关键字在指定的方法中抛出指定的异常

使用格式:

throw new xxxException("异常产生的原因");

注意:

1.throw关键字必须写在方法的内部

2.throw关键字后边new的对象必须是Exception或者Exception的子类对象

3.throw关键字抛出指定的异常对象,我们就必须处理这个异常对象

throw关键字后边创建的是RuntimeException或者是 RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)

throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch

 

Objects 非空判断

Obects类中的静态方法

public static <T> T requireNonNull(T obj):查看指定引用对象不是null。

源码:

public static <T> T requireNonNull(T obj) {

if (obj == null)

throw new NullPointerException();

return obj;

}

public class Demo04Objects {

public static void main(String[] args) {

method(null);

}

 

public static void method(Object obj){

//对传递过来的参数进行合法性判断,判断是否为null

/*if(obj == null){

throw new NullPointerException("传递的对象的值是null");

}*/

 

//Objects.requireNonNull(obj);

Objects.requireNonNull(obj,"传递的对象的值是null");

}

}

 

异常处理throws

throws关键字:异常处理的第一种方式,交给别人处理

作用:

当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象

可以使用throws关键字处理异常对象,会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM处理-->中断处理

使用格式:在方法声明时使用

修饰符 返回值类型 方法名(参数列表) throws AAAExcepiton,BBBExcepiton...{

throw new AAAExcepiton("产生原因");

throw new BBBExcepiton("产生原因");

...

}

注意:

1.throws关键字必须写在方法声明处

2.throws关键字后边声明的异常必须是Exception或者是Exception的子类

3.方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常

如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可

4.调用了一个声明抛出异常的方法,我们就必须的处理声明的异常

要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM

要么try...catch自己处理异常

 

异常处理try-catch

try...catch:异常处理的第二种方式,自己处理异常

格式:

try{

可能产生异常的代码

}catch(定义一个异常的变量,用来接收try中抛出的异常对象){

异常的处理逻辑,异常异常对象之后,怎么处理异常对象

一般在工作中,会把异常的信息记录到一个日志中

}

...

catch(异常类名 变量名){

 

}

注意:

1.try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象

2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码

如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码

 

Throwable类中定义了3个异常处理的方法

String getMessage() 返回此 throwable 的简短描述。

String toString() 返回此 throwable 的详细消息字符串。

void printStackTrace() JVM打印异常对象,默认此方法,打印的异常信息是最全面的

 

多个异常捕获

多个异常使用捕获又该如何处理呢?

1. 多个异常分别处理。

2. 多个异常一次捕获,多次处理。

3. 多个异常一次捕获一次处理。

 

 

finally有return语句

如果finally有return语句,永远返回finally中的结果,避免该情况.

public class Demo02Exception {

public static void main(String[] args) {

int a = getA();

System.out.println(a);

}

 

//定义一个方法,返回变量a的值

public static int getA(){

int a = 10;

try{

return a;

}catch (Exception e){

System.out.println(e);

}finally {

//一定会执行的代码

a = 100;

return a;

}

 

}

}

 

子父类异常

子父类的异常:

- 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。

- 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出

注意:

父类异常时什么样,子类异常就什么样

 

自定义异常

自定义异常类:

java提供的异常类,不够我们使用,需要自己定义一些异常类

格式:

public class XXXExcepiton extends Exception | RuntimeException{

添加一个空参数的构造方法

添加一个带异常信息的构造方法

}

注意:

1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类

2.自定义异常类,必须的继承Exception或者RuntimeException

继承Exception:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws,要么try...catch

继承RuntimeException:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)

 

自定义异常类的练习

要求:我们模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。

 

分析:

1.使用数组保存已经注册过的用户名(数据库)

2.使用Scanner获取用户输入的注册的用户名(前端,页面)

3.定义一个方法,对用户输入的中注册的用户名进行判断

遍历存储已经注册过用户名的数组,获取每一个用户名

使用获取到的用户名和用户输入的用户名比较

true:

用户名已经存在,抛出RegisterException异常,告知用户"亲,该用户名已经被注册";

false:

继续遍历比较

如果循环结束了,还没有找到重复的用户名,提示用户"恭喜您,注册成功!";

 

finally无论是否异常都会执行

 

常见异常参考:

https://blog.csdn.net/qq_43511657/article/details/93773275?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161837579816780269893376%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161837579816780269893376&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-93773275.first_rank_v2_pc_rank_v29&utm_term=java%E5%B8%B8%E8%A7%81%E5%BC%82%E5%B8%B8

 

总结

1.方法使用了throws抛出异常:(1)调用方法者可以throws抛出异常(2)调用方法者可以使用try-catch处理异常

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值