Java中的异常处理

来源:互联网 发布:查询mysql数据库ip 编辑:程序博客网 时间:2024/05/18 02:51

异常

指程序在运行时出现的不正常情况(问题),因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是 java 按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

体系

Throwable类(子类:Error和Exception)是 Java 语言中所有错误或异常的超类。

  • 异常的继承体系:
    • Throwable
      • Error
      • Exception
        • RuntimeException
  • 方法:
    • String getMessage():获取异常信息,返回字符串。
    • String toString():获取异常类名和异常信息,返回字符串。
    • void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。
    • void printStackTrace(PrintStream s):将此 throwable 及其追踪输出到指定的 PrintWriter,通常用该方法将异常内容保存在日志文件中,以便查阅。
Error
  • 通常指 JVM 出现重大问题如:运行的类不存在或者内存溢出等。不需要编写针对代码对其处理,程序无法处理。
Exception
  • 异常处理两种方式:

    • 捕获异常:try catch 直接处理可能出现的异常;
    • 声明异常:throws 声明告诉调用者可能的异常,暴露问题,调用者自己处理。
  • 异常的分类:

    • 编译时被检查异常 —> 编译异常(只要是Exception和其子类都是,除了特殊子类RuntimeException体系)

      • 解决方法:在程序中必须使用 try…catch 处理。
      • 异常处理格式
        try {
        //可能出异常的代码
        }
        catch(异常类 对象) {
        //处理该异常类型的语句
        }
        [finally] {
        //一定会执行的代码(通常用来关闭资源。比如:数据库资源,IO资源等)
        //catch 块中使用了”System.exit(0);” 语句除外
        }

      • 注:Java7:将多个异常写到了同一个 catch 代码块

        catch (NumberFormatException| ArithmeticException e ) {e.printStackTrace();}

      • try语句使用注意:
        1. try是一个独立的代码块,在其中定义的变量只在该变量块中有效,如果在try以外继续使用,需要在try外建立引用,在try中对其进行初始化。IO,Socket就会遇到。
        2. 函数未抛出异常,try中抛出异常,其后面的语句将执行不到。编译将报错;函数抛出异常后,try后面的语句未执行,不会报错,代码示例如下:
          class ExceptionPractise {        public static void func()//throws Exception {            try {                throw new Exception();                //System.out.println("A");            }            catch (Exception e) {                System.out.println("B");            }        }        public static void main(String[] args) {            try {                func();            }            catch (Exception e) {                System.out.println("C");            }            System.out.println("D");        }    }       /*    说明:1.若有System.out.println("A");语句编译会失败,因为抛出异常后,该句执行不到         2.不存在System.out.println("A");语句,则打印B和D         3.若有System.out.println("A");语句,且加上throws Exception,则打印B和D    */
    • 编译时不被检测的异常 —> 运行异常(Exception中的RuntimeException和其子类)

      • 这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行调整。
      • RuntimeException是那些可能在Java虚拟机正常运行期间抛出的异常的超类,可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类都无需在throws子句中进行声明
  • 自定义异常:可以自定义出的问题称为自定义异常。

    • 特点:

      • 自定义类继承Exception或者RuntimeException,通过构造函数定义异常信息
      • 通过throw将自定义异常抛出
    • 示例:当要定义自定义异常的信息时,可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数。

      class MyException extends Exception {    MyException(String message) {        super(message);    }}

    throws和throw的区别

    • throws
      • 用在方法声明后面,跟的是异常类名
      • 可以跟多个异常类名,用逗号隔开
      • 表示抛出异常,由该方法的调用者来处理
    • throw
      • 用在方法体内,跟的是异常对象名
      • 只能抛出一个异常对象名
      • 表示抛出异常,由方法体内的语句处理
  • 异常处理原则:

    • 异常处理的原则:

      1. 函数内容如果抛出需要检测的异常,那么函数上必须要声明。否则,必须在函数内用try/catch捕捉,否则编译失败。
      2. 如果调用到了声明异常的函数,要么try/catch,要么throws,否则编译失败。
      3. 什么时候catch,什么时候throws呢?功能内容可以解决,用catch。解决不了,用throws告诉调用者,由调用者解决。
      4. 一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性处理。内部有几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。
    • 异常在子类覆盖中的体现

      1. 子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
      2. 如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子类
      3. 如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
      4. 如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。
0 0
原创粉丝点击