异常的概念: 程序在运行时,发生了我们没有预测的情况,它阻止了程序按照我们预期的效果执行
异常处理的机制 在程序在发生异常以后,还能按照我们预先设定好的逻辑,继续执行后续的代码!!
package baseexception; /** * @2018年4月8日 * @王 鸿 * @Administrator */ public class BaseAbnormal { public static void main(String[] args) { System.out.println("1"); System.out.println("2"); System.out.println("3"); System.out.println("4"); System.out.println(5 / 0); System.out.println("6"); System.out.println("7"); System.out.println("8"); System.out.println("9"); System.out.println("10"); } }
下面是这个代码的运行结果
01 Exception in thread "main" //发生异常的线程
02 java.lang.ArithmeticException //发生异常的类型(只是其中的)
03 / by zero //除0 的异常 异常的原因
04 at baseexception.BaseAbnormal.main(BaseAbnormal.java:14) //异常的抛出点
baseexception 包名
BaseAbnormal 类名
main 方法
05 (BaseAbnormal.java:14) //异常发生的文件 "14" 表示异常发生的行号
--------------------------------------------------------------------华丽而高贵的分割线--------------------------------------------------------------------------
所有异常和错误的父类--Throwable;
Throwable类是java异常类型的顶级父类,一个对象只有是Throwable类的(直接或者间接)实例,它才是一个异常对象,才能被异常处理机制识别.
JDK中内建了一些常用的异常类,我们也可以自己定义异常
根据编译器对异常的处理要求: 异常分为两类:
1 运行时异常 (RuntimeException) 程序在运行时所产生的异常
2 受查异常(编译异常)(checked Exception) 在程序编译期间产生的异常
异常的5个关键字
try,catch,finally,throw .throws;
异常处理方式:
01.try的使用
try不能单独使用 必须和catch 或者finally中的 其中一个一起使用;
try中放可能发生问题的代码
如果我们的try代码块不出现异常,有finally的情况下先执行finally,之后执行finally之后的代码
如果我们的try代码块出现异常,先去catch中匹配异常如果匹配成功执行对应的catch块.否则执行finally然后程序终止!!!!
02.catch的使用
每一个catch代码块都用于捕获并处理一个特定的异常或者是异常的子类
catch (ArithmeticException ex); 定义了一个异常的类型;
catch块可以出现多个 但是不能异常类型重复!!!!
多个catch代码块中异常书写顺序,必须是从小到大.
在实际开发中异常尽量要写精确而不是直接使用顶级异常
我们的异常会从多个代码块中找到一个最先匹配的 ,然后交给这个代码处理
每个catch代码块中的变量都是独立的,别的代码块访问不了
如果try中没有异常 所有的catch被忽略
catch (ArithmeticException | Exception ex) 多个异常声明在一个catch中 这种写法只限于JDK1.7
03.finally的使用
无论什么异常finally块都会执行;
如果try中没有异常,但是有return这时候会先执行finally之后再执行return
System.exit(0):正常退出
System.exit(1):非正常退出(一般放在catch块中)
做一些清理工作,关闭流释放数据库的连接
2 throw, throws
001 throws的使用
语法:方法名称 throws 异常类型1,异常类型2;
01.thows声明在方法名称之后;
02.throws可以声明多个异常类型,每个类型之间使用 '逗号' 隔开;
03.throws声明表示当前方法可以不处理异常,而是由方法的调用者处理;
04.如果在主函数中使用throws声明异常,则由JVM处理异常!
002 throw的使用
语法:throw new 异常类型([异常提示语句]);
01.异常类型可以是Exception或者其子类;
02.一条throw语句只能抛出一个异常;
03.throw语句只能出现在方法体中
04.针对于thorw抛出的异常,有两种解决方式
使用try...catch...finally代码块处理异常
使用throws声明异常,把异常告诉调用者
-------------------------------------------------------这一块理论有一点多也是异常的重点------------------------------------------------------
**异常不光只使用java里写好的也可以咱们自己创建**
自定义异常
1.异常类必须是Throwable的子类
2.定义受查异常,建议继承Exception
3.定义运行异常,建议继承RuntimeException
语法
class 自定义异常类 extend 异常类型
package exceptionchain; /** * @2018年4月8日 * @王 鸿 * @Administrator */ public class CustomerException extends Exception { public CustomerException() { } public CustomerException(String message) { super(message); } } -------------------------------------上面是自己创建的异常--------------------------------- package exceptionchain; /** * @2018年4月8日 * @王 鸿 * @Administrator */ /* * * test1();抛出自己定义的异常 * test2(); 捕获这个异常并包装成运行时异常 继续抛出 main中 * * 调用test2()尝试捕获test()方法的抛出的异常 */ public class ChainTest { public static void main(String[] args) { ChainTest chainTest = new ChainTest(); try { chainTest.test2(); } catch (Exception e) { e.printStackTrace(); } } public void test1() throws CustomerException { throw new CustomerException("自己创建的异常"); } public void test2() { try { test1(); } catch (CustomerException e) { // 包装成运行时异常 RuntimeException runtimeException = new RuntimeException( "自己包装的运行时异常"); // 通过这个方法把捕获的异常传进去 runtimeException.initCause(e); throw runtimeException; } } }
这样我们就创建了一个属于自己的异常
----------------------------------------------------------------------------------------异常的使用原则(个人理解)----------------------------------------------------------------------------------------
1.异常只能用于非正常情况
2.为异常提供说明文档
3.尽可能的避免异常,特别是运行时异常
4.保持异常的原子性
5.避免过于庞大的try代码块
6.在catch中指定具体的异常类型
7.不要在catch块中忽略捕获的异常