java异常类_Java学习(异常类)

一、什么是异常:

异常就是在运行时产生的问题。通常用Exception描述。

在java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及异常所处的位置)。

二、异常的继承关系:

Throwable类是所有错误跟异常类的超类(祖宗类)。

Exception异常类及其子类都是继承自Throwable类,用来表示java中可能出现的异常,并且合理的处理这些异常。

RuntimeException类是运行异常类,继承自Exception类,它以及它的子类只能在运行过程中存在,当出现时,只能修改源代码,此异常无法处理。

Error类是与Exception的平级的类,用来表示Java中存在的严重错误,只能通过修改代码来解决问题。

继承体系的总结:

Throwable: 它是所有错误与异常的超类(祖宗类)|-Error 错误|-Exception 编译期异常,进行编译JAVA程序时出现的问题|- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

三、异常与错误的区别:

异常是指程序在编译或者运行时出现的某种异常问题,我们可以对异常进行某种处理,如果不处理异常的话,程序将会停止运行。

错误是指程序在运行时出现的严重问题,无法处理,程序将会停止运行,Error通常都是系统级别的问题,都是虚拟机jvm所在系统发生的,只能通过修改源代码解决问题。

四、异常产生的过程:

1.运行或编译时产生异常

2.创建异常类的对象

3.声明异常类

4.将异常类对象传给调用者(main()方法)处理

5.调用者无法处理,再将异常类对象传给jvm虚拟机

6.jvm虚拟机将异常类的信息(名称、详细信息、异常所处的位置)打印在屏幕上,并且停止程序的运行

b688d32d2c5a9284a251e6ea9847f140.png

五、抛出异常throw

在java中,提供了一个throw关键字,用来抛出一个指定的异常。

使用方法:

1.创建一个异常对象。封装一些提示信息

2.将这个异常告知调用者

使用格式:

throw new 异常类名(参数);

六、声明异常throws

声明异常格式:

修饰符 返回值类型 方法名称 (参数)throws 异常1名称,异常2名称{

}

七、捕获异常try...catch...finally

捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理

语句格式:

try{//需要被检测的语句。

}catch(异常类 变量) { //参数。//异常的处理语句。

}finally{//一定会被执行的语句。

}

try:该代码块中编写可能产生异常的代码。

catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

捕获异常的组合方式:

1.  try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。

2.  try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。

3.  一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

4. try finally组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

八、运行时期异常 RuntimeExecption

特点:

方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常

运行时期异常一旦发生,需要程序人员修改源代码

九、异常在方法重写中细节

1. 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。

classFu {public void method () throwsRuntimeException {

}

}class Zi extendsFu {public void method() throws RuntimeException { } //抛出父类一样的异常//public void method() throws NullPointerException{ }//抛出父类子异常

}

2.当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集

classFu {public void method () throwsNullPointerException, ClassCastException{

}

}class Zi extendsFu {public void method()throws NullPointerException, ClassCastException { } public void method() throws NullPointerException{ } //抛出父类异常中的一部分

public void method() throws ClassCastException { } //抛出父类异常中的一部分

}

3.当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。

classFu {public voidmethod (){

}

}class Zi extendsFu {public void method() throws Exception { }//错误的方式

}

十、异常中常用方法

在Throwable类中为我们提供了很多操作异常对象的方法,常用的如下:

d3639579c47a1f65cb0487159939ca51.png

1.getMessage方法:返回该异常的详细信息字符串,即异常提示信息

2. toString方法:返回该异常的名称与详细信息字符串

3. printStackTrace:在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

十一、自定义类异常

格式:

Class 异常名 extends Exception{ //或继承RuntimeException

public异常名(){

}public异常名(String s){super(s);

}

}

自定义异常继承Exception演示:

class MyException extendsException{/*为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。*/

publicMyException(){super();

}publicMyException(String message) {super(message);//如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。

}

}

自定义异常继承RuntimeException演示:

class MyException extendsRuntimeException{/*为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。*/MyException(){super();

}

MyException(String message) {super(message);//如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。

}

}

实例代码:

throw,throws,try/catch的使用

packagecom.oracle.Demo01;public classDemo01 {//try/catch格式: 用来处理异常//try{//被检测的代码(可能出现异常的代码)//}catch(异常类名 变量){//异常的处理方式//}finally{//必须要执行的代码//}

public static voidmain(String[] args) {int[] arr={1,2,3};try{int res=getArray(arr);

System.out.println(res);

}catch(ArrayIndexOutOfBoundsException ex1){ //多catch处理时,平级的没有先后顺序

System.out.println(ex1); //当出现父子类关系式,一定要将子类的放在前面

System.out.println("===========");

System.out.println(ex1.getMessage());

System.out.println("===========");

System.out.println(ex1.toString());

}catch(NullPointerException ex2){

System.out.println(ex2);

System.out.println(ex2.getMessage());

System.out.println("===========");

ex2.toString();

}finally{

System.out.println("必须要执行的代码");

}

System.out.println("我执行了吗");

}//throw跟throws的区别 用来报告异常//throw 关键字后面,必须跟异常对象//throws 关键字后面,必须跟异常类名 用来将异常传给调用者

public static int getArray(int[] arr) throwsArrayIndexOutOfBoundsException,NullPointerException{if(arr==null){throw new NullPointerException("数组为空o(╯□╰)o");

}if(arr.length<4){throw new ArrayIndexOutOfBoundsException("数组长度不够(キ`゚Д゚´)!!");

}int i=arr[3]*2;

System.out.println("aaa");returni;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值