异常
java程序在运行时期发生的不正常情况(问题)
java就按照面向对象的思想对不正常情况进行描述和对象的封装。
问题分2种:
Throwable:定义了对于问题的共性的功能
Error:由系统底层发生的,告诉jvm,jvm告诉使用者,不做针对性处理。直接修改代码。
Exception:jvm发生,并告诉给使用者。可以进行针对性的处理
总结:
运行时发生
符合面向对象,将问题描述并封装成对象
error和exception的区别
输出语句发生问题时,jvm就将这个已知的问题封装成了对象;
throw new ArrayIndexOutOfBoundsException(1);
将问题抛给调用者main函数。
main没有针对性的处理方式。
main就继续往外抛给调用者jvm,jvm就使用了默认的处理方式,
将问题的名称+信息+位置在控制台上显示出来,让调用者看到并结束程序。
throws 异常类,声明的目的:就是让调用者可以进行处理
异常的处理
两种:
1.遇到问题不进行具体的处理,而是继续抛给调用者
其实就是在函数上通过throws关键字声明异常,告诉调用者处理。
2.针对性的处理方式:捕获!
try
{
//有可能发生异常的代码
}
catch(异常类 变量)
{
//这是真正的捕获,处理异常的代码
}
finally
{
//一定会被执行的代码
}
System.out.println(e.getMessage());//异常信息
System.out.println(e.toString());//异常名称+异常信息
e.printStackTrace();//名字+信息+位置。jvm默认处理收到异常就是调用这个方法。
throw和throws有什么区别呢?
1.位置不同
throws用在函数上,后面跟的是异常类,可以跟多个
throw用在函数内,后面跟的是异常对象
2.功能不同
throws用来声明异常,让调用者只知道该功能有可能出现的问题,并由调用者可以给出预先的处理方式
throw抛出具体问题对象。执行到throw功能就已经结束了。跳转到调用者。并将具体的问题对象也抛给调用者。
也就是说throw语句独立存在时,下面不要定义其他语句。因为执行不到。
异常体系的特殊情况:
Exception
|–Error
|–Exception
异常体系最大的特点就是体系中的类以及类产生的对象,都具备这可抛性,
可抛性的意思是可以被throws和throw所操作。
异常的原则:
1.功能内部有异常throw抛出,功能上一定要throws声明。
内部抛什么,功能上就声明什么
声明的目的就是为了让调用者处理,如果调用者不处理,编译失败
2.特殊情况:
当函数内通过throw抛出了RuntimeException及其子类的异常对象时,函数上可以
不用throws声明
不声明的目的就是不让调用者处理
让调用者的程序停止,要对代码进行修改
Exception分2种:
编译时会被检测的异常
运行时异常(编译时不检测)RuntimeException
异常:其实就将问题封装成对象,并抛给调用者
如果声明了,就需要调用者处理(继续声明or捕获)
什么时候声明,什么时候捕获?
功能内部可以解决,就捕获,不能解决,或者解决了还必须告诉调用者问题,这时就应该声明。