1、异常简介
异常的父类:Throwable。
Throwable有两个子类:Error和Exception。
-
在发生虚拟机错误或是线程死锁时会报Error错误,一旦发生Error错了,那么整个程序就代表整个程序崩溃了。
-
Exception异常有多种,比如非检查异常、检查异常。
- 非检查异常(RuntimeException)
a. 空指针异常:NullPointException
b. 数组下标越界异常:ArrarIndexOutOfBoundsException
c. 类型转换异常:ClassCastException
d. 算术异常:ArithmeticException - 检查异常
a. 文件异常:IOException
b. SQL异常:SQLException
- 非检查异常(RuntimeException)
2、使用
- 格式
try { //一些会抛出异常的方法 } catch(Exception e) { //处理该异常的代码块 } catch(Exception2 e) { //处理Exception2的代码块 } ... (n个catch块) ... { } finally { //最终将要执行的一些代码 }
注意:
- try 语句块不可以独立存在,必须与 catch 或者 finally 块同存。
- 多重catch语句中,异常类型必须子类在前父类在后。
3、异常的抛出
-
thorw -- 将产生的异常抛出(动作)
-
throws -- 声明将要抛出何种类型的异常(声明)
public void 方法名(参数列表) throws 异常列表 { //调用会抛出异常的方法或者: throw new Exception(); }
注意:调用会抛出异常的方法时,必须使用
try-catch
处理,或者在方法中添加throws
声明,将异常抛到更上一层的调用者去处理。
4、自定义异常
-
格式:
class 自定义异常类 extends 异常类型 { }
-
使用实例:
public class DrunkException extends Exception { public DrunkException() { } public DrunkException (String message) { super(message); System.out.println(message); } }
5、异常链
使用实例:
void test2() throws DrunkException {
throw new DrunkException("出错啦");
}
void test3() throws RuntimeException {
try {
test2();
} catch (DrunkException e) {
//转换异常类型方法一:
//RuntimeException exception = new RuntimeException("运行时出错啦");
//exception.initCause(e);
//转换异常类型方法二:
RuntimeException exception = new RuntimeException(e);
throw exception;
}
}
通过转换异常类型,可以清楚的知道异常的链路。
6、实际应用中的经验与总结
- 处理运行时异常时,曹勇逻辑去合理规避同时辅助
try-catch
处理。- 在多重
catch
块后面,可以加一个catch(Exception)
来处理可能会被遗漏的异常。- 对于不确定的代码,也可以加载
try-catch
,处理潜在的异常。- 尽量去处理异常,切忌只是简单的调用
printStackTrace()
去打印输出。- 具体如何处理异常,要根据不同的业务需求和异常类型去决定。
- 尽量添加
finally
语句块去释放占用的资源。
网友评论