1.异常机制
1.1概述
异常是Java中提供的一种识别及响应错误情况的一致性机制。有效地异常处理能使程序更加健壮、易于调试。
异常发生的原因有很多,比如:
- 用户输入了非法数据
- 要打开的文件不存在
- 网络通信时连接中断
- JVM内存溢出
- 这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
异常发生的原因有很多,尤其是用户输入和要打开的资源不存在。 这些异常出错后,后导致程序生命周期终止执行,从错误代码开始,之后的代码都不会执行。java中 有一个专门模拟异常的类,就是 Throwable , 所有异常都继承这个类。
1.2常见的异常
空指针
下标越界
栈内存溢出
类型转换异常
1.3继承机制
1.4Error
1概念
系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理。
比如:OOM(内存溢出错误)、VirtualMachineError(虚拟机错误)、StackOverflowError(堆栈溢出错误)等,一般发生这种情况,JVM会选择终止程序。
2实例
//堆栈溢出错误
public class TestError {
public static void recursionMethod() {
recursionMethod();// 无限递归下去
}
public static void main(String[] args) {
recursionMethod();
}
}
报错信息:
Exception in thread "main" java.lang.StackOverflowError
at com.TestError.recursionMethod(TestError.java:5)
at com.TestError.recursionMethod(TestError.java:5)
at com.TestError.recursionMethod(TestError.java:5)
at com.TestError.recursionMethod(TestError.java:5)
at com.TestError.recursionMethod(TestError.java:5)
at com.TestError.recursionMethod(TestError.java:5)
... ...
1.5Exception
1.5.1是什么
Exception是所有异常类的父类。分为非RuntimeException和RuntimeException 。
- 非RuntimeException
指程序编译时需要捕获或处理的异常,如IOException、自定义异常等。属于checked异常。 - RuntimeException
指程序编译时不需要捕获或处理的异常,如:NullPointerException等。属于unchecked异常。一般是由程序员粗心导致的。如空指针异常、数组越界、类型转换异常等
1.5.2常见方法
异常处理的两种方式
1 throws : 抛出异常,告诉调用处,这里可能有什么问题
如果你把异常抛给了调用处.那么调用处要么也抛出去,要么解决
2 try...catch... : 解决异常
1.5.3Try...catch....
1
try{
高风险代码;
}catch(异常类型 变量){
解决方案;
}
2
try{
高风险代码;
} catch(异常类型 变量){
处理方案;
} catch(异常类型 变量){
处理方案;
}...
catch中异常类型 不能有继承关系,如果有继承关系,需要从子类到父类
实例:
3
Java1.7新特性 自动关闭资源
try{
开启资源;
}catch(异常类型 变量){
处理措施;
}finally{
关闭资源
}
-----
try(开启资源){
高风险代码;
}catch(异常类型 变量){
处理措施;
}
实例 :
1.5.4覆写
方法覆写,不能比原方法拥有更宽泛的异常
抛出的异常类,可以是父类方法中抛出的类,也可以是对应的子类 , 但是不能是它的父类
父类抛出一个异常A , 那么子类 要么还抛出A , 要么抛出A的子类, 要么不抛异常 , 但是不能是A的父类
1.5.5Throws
throws 抛出异常,并不会处理异常,是一种提醒机制
如果你调用 的方法,抛出一个编译时异常,要么你就try..catch处理掉,要么你也抛出
throws 是抛出异常,并不会解决异常,一般用于类库端(被调用的这个类)
而 try...catch... 是解决异常的,一般用于客户端(调用其他类的这个类,一般客户端都有main方法)
抛异常 可以同时抛出多个,逗号隔开,没有先后顺序
1.5.6Finally
finally : 必须执行的语句块 比如 打开的资源,需要关闭
1 finally 不能单独出现,必须和try一起使用 或者和 try...catch...一起使用
2 finally语句块 只有一种不执行的情况,那就是关闭虚拟机 System.exit(0);
1.5.6.2注意
在class文件中
1.5.6.3应用场景
1.5.7Throw
异常源点
Throw new 异常类(错误信息);
参考自定义异常
1.5.8自定义异常类
1.5.8.1自定义
1 继承一个已有的异常类
判断你应该是运行是异常还是编译时异常,如果是运行时异常需要继承 RuntimeException 否则就继承Exception即可
一般情况下 我们写的 一定是 编译时异常
2 公共的无参构造
3 公共的有参构造,传入字符串,并在构造方法中把该字符串传递给父类