错误:
代表JVM本身的错误,等于JVM的一个故障,不希望被捕捉,我们一般不能处理
必须修改源代码,程序才能继续执行 无法治愈的毛病
OutOfMemoryError内存溢出错误
不能抛出异常
必须修改代码
异常:
处理异常的方式是中断处理,产生异常就是创建异常对象并抛出一个异常对象,异常不是语法错误
可以被用户程序捕捉,可以被处理,常见异常NullPointer空指针异常 ClassCast类转换异常 IndexOutOfBounds索引越界异常 Arithmetic算术异常 整数除0 ClassNotFound找不到类
没有抽象方法的抽象类 NoSuchElement没有元素异常 Parse解析异常
Runtime运行期异常,java程序运行过程出现的问题
把异常处理掉,程序可以继续运行 小毛病
编译异常
处理异常两种:一:throws抛出异常,交给虚拟机处理:中断处理。 二:try catch
JVM检测出异常会做两件事:
1.JVM根据异常产生原因创建一个异常对象,这个异常对象包含了异常产生的(内容,原因,位置)
2.在方法中,没有异常处理逻辑try catch,那么久会把异常抛出给调用者main来处理异常。main收到异常也没有异常的处理逻辑,继续把对象抛出给main方法调用者JVM处理。
JVM接收到异常做了两件事,把异常对象(内容,原因,位置)以红色字体打印在控制台
JVM会终止当前正在执行的Java程序——中断处理。
throw关键字:
格式: throw new xxxException(异常产生的原因)
必须写在方法内部
new后后面必须是Exception或者是它子
throws关键字:
格式:修饰符 返回值类型 方法名(参数列表)throws AAAException,BBBException{
throw new AAAException(“产生原因”);
throw new BBBException(“产生原因”);
}
交给别人处理
当方法内部抛出异常对象的时候,我们必须处理这个异常对象
可以抛出给调用者处理(自己不处理,给别处理)。最终交给JVM处理,,中断处理,要么try catch
如果抛出多个对象,那么后面必须声明多个异常
如果抛出多个对象,他们有父子关系,声明父类即可
中断程序,后面的代码不再执行
try catch关键字
格式:
try{
可能产生异常的代码
}catch(定义一个异常的变量,用来接收try中抛出的异常){
异常的处理逻辑
一般在工作中,会把异常的信息记录到一个日志
} … catch(异常类名 变量名){
}
注意
1.try中可能抛出多个异常对象,那么就可以使用多个catch处理
2.如果try没有异常产生,那么就不会执行catch的逻辑处理,执行完try中的代码,继续执行try..catch之后的代码
Throwable类定义3个异常处理方法
String getMessage()返回此 throwable简短描述
String toString()返回此详细字符串(打印e默认是打印这个方法)
void printStackTrace()JVM打印异常对象,默认此方法,打印的异常信息是最全面的。
finally:
无论异常是否发生,都需要执行。一般用于资源释放(资源回收),最后都要资源释放
不能自己使用,必须和try一起
自定义异常类:
格式:public class XXException extends Exception|RuntimeException{
添加一个空参数的构造方法
添加一个带异常信息的构造方法
}
自定义异常类必须继承Exception或者Runtime
Exception,那么就是编译器异常,就必须处理,要么throws,要么try…catch
Runtime,那么就是运行期异常。无需处理交给JVM处理,中断处理