异常的定义:
Java代码在运行时期发生的问题就是异常!
在Java中,把异常信息封装成了一个类!当出现了问题时,就会创建异常类对象并抛出异常相关的信息(异常信息,位置…)!
异常的继承关系:
Object-->Throwable-->Exception-->RuntimeException
//可以选中异常类型,然后Ctrl+T来查看继承关系!
Throwable: 它是所有错误与异常的超类
|- Error 错误
|- Exception 编译期异常,进行编译JAVA程序时出现的问题
|- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题
//内存溢出错误!
//数组越界异常,以上代码中arrint数组下标只到2,但是调用的方法中却用了下标3,因此发生数组越界异常!
当发生数组越界异常时,JVM会做两件事:
① 创建异常对象ArrayIndexOutOfBoundsException TestEx;
② 将异常对象抛给调用者(这里是get(arrint))!
③ JVM将错误对象抛给Main方法发现还是没有处理语句,继续往上抛给虚拟机(JVM),JVM会将异常信息以红字的方式打印在控制台以及结束程序!
Error:错误!
Exception:异常!
指程序在运行期间发生了某种错误,Error错误通常没有具体的处理方式,程序将会结束运行!往往都是系统级别的问题,都是JVM所在系统发生的,并反馈给JVM的,我们无法针对处理,只能修正代码!
在Java中,提供了一个Throw关键字,它用来抛出一个指定的异常对象:
① 创建一个异常对象,封装一些提示信息(信息可以自己编写)!
② 用Throw关键字将这个异常对象告知给调用者!
格式:
throw new 异常类名(参数);
//目前学到的RuntimeException的构造方法:
声明异常Throws:
将问题标识出来,报告给调用者!如果方法内通过Throw抛出了编译时异常,而没有捕获处理,那么必须通过Throws进行声明,让调用者去处理!
声明异常格式:
修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2… { }
异常捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理!
捕获异常格式:
try {
//需要被检测的语句。
}
catch(异常类 变量) {
//异常的处理语句。
}
finally {
//一定会被执行的语句。
}
try:该代码块中编写可能产生异常的代码!
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理!
finally:有一些特定的代码无论异常是否发生,都需要执行!另外,因为异常会引发程序跳转,导致有些语句执行不到,而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的!
//try-catch如果捕获到了异常,try-catch以下的代码是不会被执行的!
Try-Catch-Finally捕获异常的组合方式:
① Try-Catch-Finally组合:检测异常,并传递给Catch处理,并在Finally中进行资源释放!
② Try-Catch组合:对代码进行异常检测,并对检测的异常传递给catch处理!对异常进行捕获处理!
③ 一个Try多个Catch组合:对代码进行异常检测,并对检测的异常传递给catch处理,对每种异常信息进行不同的捕获处理!
④ Try-Finally组合:对代码进行异常检测,检测到异常后因为没有Catch,所以一样会被默认JVM抛出!异常是没有捕获处理的,但是功能所开启资源需要进行关闭,所有Finally只为关闭资源!
运行时期异常RuntimeException:
RuntimeException和他的所有子类异常,都属于运行时期异常!
方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常,运行时期异常一旦发生,需要程序人员修改源代码!
异常在方法重写中的细节:
① 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明!
② 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集!
③ 当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的!
异常中常用的方法:
① getMessage()异常类名和异常信息!
② printStackTrace()打印异常详细信息!
③ toString()异常信息!
自定义异常:
格式:
Class 异常名 extends Exception{
//或者继承RuntimeException!
public 异常名(){
}
public 异常名(String s){
super(s);
}
}
//以上调用父类Exception的有参构造!
示例代码:
try{
可能会发生异常的代码
}catch(异常对象 ex){
处理语句
}finally{
不管出不出现异常必须执行的语句
一般写释放资源的语句
}
package com.oracle.errorexception;
public class Demo03{
public static void main(String[] args) {
int[] arr=null;
try{
int index=get(arr);
System.out.println(index);
}catch(NullPointerException ex){
System.out.println(ex);
}
}
public static int get(int[] arr) throws NullPointerException,ArrayIndexOutOfBoundsException{
if(arr==null){
throw new NullPointerException("数组为空");
}
if(arr.length<4){
throw new ArrayIndexOutOfBoundsException("数组长度不够");
}
return arr[3]+1;
}
}
//try中一旦发生异常,try中其余代码将不再执行,直接跳到catch进行异常捕获!
//RuntimeException及其子类不需要Throws!
package com.oracle.errorexception;
public class Demo04{
public void eat() throws Exception{
}
}
class Zi extends Demo04{
//如果父类方法抛出异常,那么子类重写后的方法有两种选择:①不抛异常②抛异常,但是异常类型不能超越父类!
//如果父类没有异常,子类重写后不能抛出异常!但是如果重写后的方法中调用了抛出异常的方法,只能Try-Catch
public void eat(){
}
}