本文主要是介绍Throwable_error_Exception,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一,概述:
1,异常和错误:Java编译或运行时期发生的不正常行为。运行时除了exception还有error
异常Exception:通常发生的错误可以有针对性的处理方式。
错误error:通常发生后不会有针对性的处理方式,error 的发生通常都是系统级别的问题,都是有jvm所在的系统发生的病反馈给jvm虚拟机的,无法针对性的处理,只能修改代码。
2,异常的分类:
异常分为受查异常和运行时异常,两者都在异常类的层次结构中。
受查异常(checked exceptions),:受查异常,必须被try{}catch捕获,或者在方法签名中,通过throws子句声明。受检查的异常必须在编译被捕获时捕捉处理,命名为CheckedException是因为将AVAV要进行检查,java虚拟机也要进行检查,以确保这个规则得到遵守。
运行时异常(runtime exceptions): 需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除...
而声明为Error的,则属于严重错误,需要根据业务信息进行特殊处理,Error不需要捕捉。
而声明为Error的,则属于严重错误,需要根据业务信息进行特殊处理,Error不需要捕捉。
图例:异常类的继承关系(红色为受查异常,黑色为运行时异常):
3,异常发生的细节:
主函数收到异常对象。没有处理,main函数就会继续抛出给调用者jvm,jvm收到问题后,就做出了最终的处理方式,将问题对象中的名称,信息,问题的位置,都显示在屏幕上,让软件使用者知道。同时让程序提前终止。
二,Throwable类:
1,throwable类:
是Java语言中所有错误或异常的超类,只有当对象是此类(或其子类之一)的实例时,才能通过Java虚拟机或者Java throw语句抛出,类似,只有此类或其子类之一才可以是catch子句中的参数类型。
2,方法:
构造方法:
Throwable()
构造一个将null
作为其详细消息的新 throwable。
Throwable(String message,Throwable cause)
构造一个带指定详细消息和 cause 的新 throwable。
一般方法:
printStackTrace()
将此 throwable 及其追踪输出至标准错误流。
getStackTrace()
提供编程访问由 printStackTrace()
输出的堆栈跟踪信息。
toString()
返回此 throwable 的简短描述。
3,一些主要子类对应的异常处理功能简要说明如下:
ArithmeticException——由于除数为0引起的异常;
ArrayStoreException——由于数组存储空间不够引起的异常;
ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常;
IllegalMonitorStateException——监控器状态出错引起的异常;
NegativeArraySizeException—一数组长度是负数,则产生异常;
NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常;
ArrayStoreException——由于数组存储空间不够引起的异常;
ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常;
IllegalMonitorStateException——监控器状态出错引起的异常;
NegativeArraySizeException—一数组长度是负数,则产生异常;
NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常;
当应用程序试图在需要对象的地方使用null时,抛出该异常,这种情况包括:
1,调用null对象的实例方法。
2,访问或修改null对象的字段。
3,将null作为一个数组,获得其长度。
4,将null作为一个数组,访问或修改其时间片。
5,将空作为throwable值抛出。
OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空 间则产生异常;
SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常
IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;用非法索引访问数组时抛出的异常,如果索引为负或大于等于数组大小,则该索引为非法索引。
IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;
ClassNotFoundException——未找到指定名字的类或接口引起异常;
CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常;
InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从 而引起异常,有关线程的内容,将在下一章讲述;
NoSuchMethodException一所调用的方法未找到,引起异常;
Illega1AccessExcePtion—一试图访问一个非public方法;
StringIndexOutOfBoundsException——访问字符串序号越界,引起异常;
ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常;
NumberFormatException——字符的UTF代码数据格式有错引起异常;
IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常;
FileNotFoundException——未找到指定文件引起异常;
EOFException——未完成输入操作即遇文件结束引起异常。
OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空 间则产生异常;
SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常
IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;用非法索引访问数组时抛出的异常,如果索引为负或大于等于数组大小,则该索引为非法索引。
IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;
ClassNotFoundException——未找到指定名字的类或接口引起异常;
CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常;
InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从 而引起异常,有关线程的内容,将在下一章讲述;
NoSuchMethodException一所调用的方法未找到,引起异常;
Illega1AccessExcePtion—一试图访问一个非public方法;
StringIndexOutOfBoundsException——访问字符串序号越界,引起异常;
ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常;
NumberFormatException——字符的UTF代码数据格式有错引起异常;
IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常;
FileNotFoundException——未找到指定文件引起异常;
EOFException——未完成输入操作即遇文件结束引起异常。
4,异常-finally的使用:
需求:有一些特定的代码无论是否发生异常都需要执行,因为异常会引发程序的跳转,导致有些语句执行不到,无法满足这个要求。异常捕获处理时Java提供的解决方案:try catch finally语句,finally就是解决这个问题的,finally中存放的代码无论如何都会执行。
需求:有一些特定的代码无论是否发生异常都需要执行,因为异常会引发程序的跳转,导致有些语句执行不到,无法满足这个要求。异常捕获处理时Java提供的解决方案:try catch finally语句,finally就是解决这个问题的,finally中存放的代码无论如何都会执行。
注意:有一种情况发生finally代码也会不执行:system。exit();退出jvm。
5,自定义异常:必须是继承throwable类,或者继承throwable的子类。该对象才可以被throw抛出。可抛性:可以被throw关键字操作。
三,try catch;try finally;try catch finally语句:
1,try catch:对代码进行异常检测,并对检测的异常传递给catch处理,异常捕获处理:
void show()//不用throws
{try{throw new Exception();}catch(Exception e){}
}
2,try finally:对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出,异常是没有捕获处理的,但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。
void show()//需要throws
{try{throw new Exception();}finally{}
}
3,try catch finally:检测异常,并传递给catch处理,并定义资源释放。
异常在继承或者实现中的使用细节:*****
1,子类覆盖父类方法时,如果父类的方法声明异常,子类只能抛出父类异常或者该异常的子类,或者不声明。
2,当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
3,当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。
举例:父类存在这种情况,接口也有这种情况,
问题:接口中没有声明异常,而实现的子类覆盖方法时发生了异常。
无法进行throws声明,只能catch的捕获。万一问题处理不了呢?
catch中继续throw抛出,但是只能将异常转换成runtime异常的子类抛出。
1,子类覆盖父类方法时,如果父类的方法声明异常,子类只能抛出父类异常或者该异常的子类,或者不声明。
2,当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
3,当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。
举例:父类存在这种情况,接口也有这种情况,
问题:接口中没有声明异常,而实现的子类覆盖方法时发生了异常。
无法进行throws声明,只能catch的捕获。万一问题处理不了呢?
catch中继续throw抛出,但是只能将异常转换成runtime异常的子类抛出。
Inteface Inter{public void show();}class demo implement Inter {public void show(){try{throw new Exception(); }catch(Exception e){code.....throw new RuntimeException("");//告知调用者问题所在。 }}}
四,细节:
1,throw和throws区别:
1,throw用在函数内。throws用在函数上。
1,throw用在函数内。throws用在函数上。
2,throw抛出的是异常对象,
throws用于进行异常类的声明,后面异常类可以有多个,用逗号隔开。
3,hrows是用来声明一个方法可能抛出的所有异常信息throw则是指抛出的一个具体的异常类型。
4,两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
5,throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。
这篇关于Throwable_error_Exception的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!