zoukankan      html  css  js  c++  java
  • JAVA里的异常

    一、概念和分类

    JAVA程序设计语言中,异常对象都是Throwable类的一个实例。Throwable分为Error和Exception。

      其中,Error类层次结构描述了JAVA运行时系统的内部错误和资源耗尽错误,这种错误无法操作。在设计JAVA程序时,我们只需要关注Exception。

      Exception包含两个分支:

      1. RuntimeException
      2. 其他异常。

      划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于I/O错误这类问题导致的异常属于其他异常。

      RuntimeException即是运行时异常,即在程序运行的时候才出现的异常,又称“未检查异常”,意即“编译器未检查出的异常”。

      其他异常称为“已检查异常”。

      派生于RuntimeException的异常包含下面几种情况:

      • 错误的类型转换。
      • 数组访问越界
      • 访问空指针

      其他异常包括:

      • 试图在文件发问后面读取数据
      • 试图打开一个不存在的文件。
      • 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。

     二、异常的声明

      在JAVA的方法里,如果可能遇到无法处理的情况,比如要打开的文件并不存在,这时就要声明异常。声明异常的方法是在方法的首部声明所有可能抛出的异常。比如标准类库中的FileInputStream类的一个构造器的声明:

      

      一个方法必须声明所有可能抛出的已检查异常(Exception中RuntimeException之外的其他异常),而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。

      如果一个方法没有声明所有可能发生的已检查异常,编译器就会报错。

    三、异常的抛出

      异常的抛出使用“throw”关键字,比如一个方法可能出现EOFException,我们希望它抛出这个异常,可以用下面的语句:

      throw new EOFExcetion();

    或: 

      EOFExcetion e = new EOFException();
      throw e;

      如果一个方法里使用了throw关键字抛出了一个异常,并且这个异常又不是RuntimeException,那么必须在方法首部用throws声明这个异常。

      如果一个方法用throws声明了一个异常,那么调用这个方法的方法就必须对这个异常进行捕获,或者继续声明。(这个有一点例外,如果父类方法中没有声明异常,那么子类在覆盖父类这个方法的时候也不能声明异常,见JComponent.paintComponent方法)

    四、创建异常类

      有时候我们可能会遇到所有标准异常类都无法准确处理的问题,比如

      int age = -1;

      这行代码本身没有什么问题,但是实际上年龄不可能为负数。这个时候我们就需要自己来创建一个异常类:

      

      

    五、异常的捕获

      如果某个异常没有在任何地方进行捕获,那么程序就会终止执行,并在控制台上打印出异常信息,其中包括异常的类型和堆栈和内容。

      要想捕获一个异常,必须设置 try/catch 语句块:

      try{
        someCode;
      }catch(ExceptionType e){
        handle for this Exception;
      }
    •   如果在try语句块中的任何代码抛出了一个在catch子句中有被说明的异常类,那么程序将跳过try语句块的其余代码,并且执行catch子句中的处理代码。
    •   如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch语句。
    •   如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出。

      

  • 相关阅读:
    [Luogu1126] 机器人搬重物
    [POJ1830] 开关问题
    [bzoj3139] 比赛
    [POJ3349] Snowflake Snow Snowflakes
    The Tour
    [POJ3740] Easy Finding
    [vijos1453] 曼哈顿距离
    [POJ1632] Vase collection
    Codewars笔记
    Appium知识积累
  • 原文地址:https://www.cnblogs.com/livterjava/p/4761072.html
Copyright © 2011-2022 走看看