JAVA中的异常

异常的概念: 程序在运行时,发生了我们没有预测的情况,它阻止了程序按照我们预期的效果执行 

异常处理的机制 在程序在发生异常以后,还能按照我们预先设定好的逻辑,继续执行后续的代码!!

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块中忽略捕获的异常

原文地址:https://www.cnblogs.com/wh1520577322/p/8747285.html