Java中的异常

  1. 概述
  2. 异常体系
  3. 异常分类
  4. 异常的处理

概述

异常情形(exceptional condition)是指阻止当前方法或作用域继续执行的问题。

异常往往能降低错误处理代码的复杂度。如果不使用异常,那么就必须检查特定的错误,并在程序中的许多地方去处理它。而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误。理想情况下,只需在一个地方处理错误,即所谓的异常处理程序中。这种方式不仅节省代码,而且把“描述在正常执行过程中做什么事”的代码和“出了问题怎么办”的代码相分离。总之,与以前的错误处理方法相比,异常机制使代码的阅读、编写和调试工作更加井井有条。 —《On Java 8》

异常体系

异常机制其实是帮助我们找到程序中的问题,异常的根类是 java.lang.Throwable ,其下有两个子类:java.lang.Error 与 java.lang.Exception ,平常所说的异常指 java.lang.Exception 。

Throwable体系

  • Error:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。
  • Exception:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

Throwable中的常用方法:

  • public void printStackTrace() :打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置。
  • public String getMessage() :获取发生异常的原因。提示给用户的时候,就提示错误原因。
  • public String toString() :获取异常的类型和异常描述信息(不用)。

异常分类

  • 编译时期异常:checked exception。在编译时期,就会检查,如果没有处理异常,则编译失败。(如SQLException,IOException,ClassNotFoundException)
  • 运行时期异常:runtime exception。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如ClassCastException,ArrayIndexOutOfBoundsException)

异常的处理

  • Java异常处理的五个关键字:try、catch、finally、throw、throws

  • 简单粗暴 throws

    声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。若一直外抛不处理,最终由JVM采用中断处理,停止程序
    声明格式

    修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }
    public void throwMyException() throws 异常类名1,异常类名2…{ }

    多个异常以逗号“ , ”分隔

  • 自己处理 try…catch{}

    使用格式

    try{

    // 会出现异常的程序代码

    }catch(异常类型1 异常的变量名1){

    // 出现异常类型1 情况下的处理程序代码

    }catch(异常类型2 异常的变量名2){

    // 出现异常类型2 情况下的处理程序代码

    }catch(异常类型3 异常的变量名3){

    // 出现异常类型3 情况下的处理程序代码

    }finally{

    //不管有没有异常都会执行的代码,,通常进行资源的释放。关闭文件、关闭IO、……

    }
    idea使用快捷键可以自动生成try..catch

可以用多个catch进行多重捕获,若多个异常中存在继承关系,要把父类放在下面,此执行过程相当于switch-case体系中加了break的单匹配,一旦匹配则进入处理,不再往下匹配


  • throw和throws
    • throws:一般使用在方法上,用于声明方法运行时可能产生的异常—- ↑ 声明格式

    • throw:手动抛出异常

      使用格式:throw 异常对象 如—-> throw new NullPointerException()

    • 用throw和throws实现自定义异常
      根据需求选择继承哪个类:

      • 继承Exception:此类异常强制性处理;
      • 继承RuntimeException:选择性进行处理。
      class MyException extends RuntimeException{
          public MyException(String msg) {
          super(msg);
          }
      }
      class Echo {
          public void say (String str) {
              if("试试".equals(str)) {
                  throw new MyException("试试自己定义一个异常");
              }esle{
              System.out.println(str);
              }
          }
      }
      
      public class TestMyException {
          public static void main(String args[]) {
              Echo.say("试试");//RuntimeException不要求强制性的异常处理,可以不catch
          }
      }

throw和throws的区别

  • throw:表示手工进行一个异常类的实例化对象抛出;

  • throws:用于方法声明出,告诉方法调用者本方法有可能产生哪些异常,在该方法不进行异常处理,而将异常处理权抛给方法调用者。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1401362462@qq.com

文章标题:Java中的异常

字数:1.2k

本文作者:百xiao生

发布时间:2020-11-27, 15:06:35

最后更新:2020-12-07, 15:07:50

原始链接:https://baixiaoshengzjj.top/2020/11/27/Java%E4%B8%AD%E7%9A%84%E5%BC%82%E5%B8%B8/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。