zoukankan      html  css  js  c++  java
  • 异常笔记--java编程思想

    开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多...

    1. 基本概念

    异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.
    抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止
                                             3. 当前环境抛出异常对象的引用.
                                             4. 异常处理机制接管程序.

    2. 异常结构

    Throwable是Error和Exception的基类.
    Error表示编译时和系统错误(除特殊情况外一般不用你关心),Exception是可以抛出的基本类型.
    运行时异常(RuntimeExcption),他们会自动被虚拟机抛出,就是编写的方法中不需要显示的抛出RuntimeException. 运行时异常被称为"不受检查异常",这种异常属于错误,将被自动捕获,不需要你亲自动手.
    RuntimeException代表的是编程错误:

    • 无法预料的错误.比如在你控制范围之外传进来的null引用.
    • 作为程序员,这个异常是应该在代码中进行检查的错误,比如 ArrayIndexOfBoundsException,就是因为没有检查一下数组的大小.

    3. finally作用

       注意点:

    • 无论try 子句中异常是否抛出,finally子句总能被执行.
    • 当涉及到break和continue子句时,finally子句也会执行.

       finally主要用来把出内存之外的资源恢复到它们的初始状态: 已经打开的文件和网络连接.

    4.  异常的限制

        当子类覆盖父类的方法,只能抛出在基类方法的异常声明中列出的那些异常,只有这样使用基类的代码才能应用在其派生类的对象上, 就是体现了面向对象的思想. 

    以下代码摘自java编程思想第12章,12.9节.只粘贴了部分.

    class BaseballException extends Exception {}
    class Foul extends BaseballException {}
    class Strike extends BaseballException {}
    
    abstract class Inning {
      public Inning() throws BaseballException {}
     
      public abstract void atBat() throws Strike, Foul;
      public void walk() {} // Throws no checked exceptions
    } 
    
    class PopFoul extends Foul {}
    public class StormyInning extends Inning {
      // OK to add new exceptions for constructors, but you
      // must deal with the base constructor exceptions:
      public StormyInning()
        throws RainedOut, BaseballException {}
        // Overridden methods can throw inherited exceptions:
      public void atBat() throws PopFoul {}
    }

     5. 构造器中的异常

    构造器会把对象设置成安全的初始状态,但还会有别的动作,比如打开一个文件,在使用完毕后才能关闭文件. 但是如果在构造器中抛出了异常,请李行为就不能正常工作,比如关闭文件.

     比如以下这个类:

    public class InputFile {
      private BufferedReader in;
      
      public InputFile(String fname) throws Exception {
        try {
          in = new BufferedReader(new FileReader(fname));
          // Other code that might throw exceptions
        } catch(FileNotFoundException e) {
          System.out.println("Could not open " + fname);
          // Wasn't open, so don't close it
          throw e;
        } catch(Exception e) {
          // All other exceptions must close it
          try {
            in.close();
          } catch(IOException e2) {
            System.out.println("in.close() unsuccessful");
          }
          throw e; // Rethrow
        } finally {
          // Don't close it here!!!
        }
      }
      public String getLine() {
        String s;
        try {
          s = in.readLine();
        } catch(IOException e) {
          throw new RuntimeException("readLine() failed");
        }
        return s;
      }
      public void dispose() {
        try {
          in.close();
          System.out.println("dispose() successful");
        } catch(IOException e2) {
          throw new RuntimeException("in.close() failed");
        }
      }
    } ///:~
    

      当抛出FileNotFoundException时, FileReader构造失败,这时文件都没有找到,当然没必要关闭文件,所以在最外层的try,finally中没有关闭输入流.

  • 相关阅读:
    C#预编译指令
    net 数据库连接详解 相当经典啊
    C#中参数前缀ref、out的使用
    C#中HTML字符转换函数
    SQL语句【TSQL汇总】
    64位XP操作系统下访问Access数据库的问题及解决
    ASP.NET Cache的一些总结
    xml 总结
    POJ 1011 Sticks
    POJ 3278 Catch That Cow
  • 原文地址:https://www.cnblogs.com/jycboy/p/7562475.html
Copyright © 2011-2022 走看看