• Java —异常


    • 异常简介

      有异于常态,和正常情况不一样,有错误出现,阻止当前方法或作用域,称为异常。

      Java中的异常类都继承Throwable类,它有两个子类:Error和Exception。Error很少接触,主要指虚拟机错误、线程死锁等。Exception异常,可能是编码、环境、用户操作输入出现问题。

      Exception有很多子类,主要有RuntimeException(非检查异常)和其他异常类(检查异常)。其中引起RuntimeException可能是NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组下标越界异常)、ClassCastException(类型转换异常)和ArithmeticException(算术异常)等,说明代码的逻辑有问题,需要改进代码,他们都是RuntimeException的子类。引起检查异常可能是IOException(文件异常)、SQLException(SQL异常)等。

    • 处理异常
    try{
        //一些会抛出异常的方法  
    } catch (Exception e) {
        //处理异常的代码块
    }

      try抛出异常后,抛出异常的方法会终止执行,程序的控制权将被移交给catch块中的异常处理程序。try-catch语句块执行完之后,外面的语句会顺序执行。

      如果会出现多种类型的异常,这时用到了多重catch块,在try块后用多个catch块来捕获多种类型的异常,对其进行相应的处理。

    try{
        //一些会抛出异常的方法  
    } catch (Exception e) {
        //处理异常的代码块
    } catch (Exception2 e) {
        //处理异常的代码块
    } ...(n个catch块)...{
    }

      注意先子类后父类的顺序编写catch语句块。

      用try-catch语句块处理完异常后,进行善后工作,可以用finally语句块。

    try{
        //一些会抛出异常的方法  
    } catch (Exception e) {
        //处理异常的代码块
    } catch (Exception2 e) {
        //处理异常的代码块
    } ...(n个catch块)...{
    } finally {
        //最终将要执行的一些代码
    }

    •  异常抛出

      throw — 将产生的异常抛出

      throws — 声明将要抛出何种类型的异常

    public void 方法名(参数列表) throws 异常列表 {
        //调用会抛出异常的方法或者throw new Exception();
    }

      可以抛出多种类型异常,每种异常类型中间用逗号隔开。如果某个方法调用了抛出异常的方法,那么这个方法必须添加try-catch语句去捕获这种异常,或者添加throws声明,将异常抛出给更上一层的调用者去进行处理。

    package com.test;
    
    public class Demo {
        public static void main(String[] args) {
            Demo demo = new Demo15();
            demo.complete();
            try {
                demo.complete1();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        public void devide(int one, int two) throws Exception {
            if (two == 0) {
                throw new Exception("两数相除,除数不能为0");
            } else {
                System.out.println("两数相除,结果为:" + one / two);
            }
        }
        
        public void complete() {
            try {
                devide(5, 0);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        
        public void complete1() throws Exception {
            devide(3, 0);
        }
    }

      执行结果:

      两数相除,除数不能为0
      两数相除,除数不能为0

    • 自定义异常
    class 自定义异常类 extends 异常类型 {
    
    }
    package com.test;
    
    public class MyException extends Exception {
        public MyException () {
            
        }
        public MyException(String message) {
            super(message);
        }
    }
    •  异常链
    package com.test;
    
    public class ExceptionChain {
        public static void main(String[] args) {
            ExceptionChain ec = new ExceptionChain();
            try {
                ec.test2();
                //ec.test3();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public void test1() throws Exception {
            throw new Exception("抛出异常1");
        }
        public void test2() {
            try{
                test1();
            } catch (Exception e) {
                RuntimeException newExc = new RuntimeException("抛出异常2");
                newExc.initCause(e);
                throw newExc;
            }
            
        }
    public void test3() { try{ test1(); } catch (Exception e) {
    //处理异常的另一种形式 RuntimeException newExc
    = new RuntimeException(e); throw newExc; } } }

      执行结果:

    java.lang.RuntimeException: 抛出异常2
        at com.test.ExceptionChain.test2(ExceptionChain.java:20)
        at com.test.ExceptionChain.main(ExceptionChain.java:7)
    Caused by: java.lang.Exception: 抛出异常1
        at com.test.ExceptionChain.test1(ExceptionChain.java:14)
        at com.test.ExceptionChain.test2(ExceptionChain.java:18)
        ... 1 more
  • 相关阅读:
    教你写Makefile(很全,含有工作经验的)
    configure.in详解
    使用autoconf与automake自动生成MakeFile文件
    例解 autoconf 和 automake 生成 Makefile 文件
    MYSQL:SQL中Group By的使用
    日志文件系统syslog,syslog-ng
    syslog-ng应用详解
    sublime的lua插件
    MySQL索引类型
    linux下automake用法
  • 原文地址:https://www.cnblogs.com/tianxintian22/p/6579853.html
Copyright © 2020-2023  润新知