zoukankan      html  css  js  c++  java
  • java-异常处理

    异常定义

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
    比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error; 如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。

    异常发生的原因有很多,通常包含以下几大类:

    用户输入了非法数据。
    要打开的文件不存在。
    网络通信时连接中断,或者JVM内存溢出。

    这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
    要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:

    检查性异常:最具代表的检查性异常是用户错误或问题引起的异常, 这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
    运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
    错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

    exception类的层次

    所有的异常类是从java.lang.Exception类继承的子类。
    Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error 。
    Java程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
    Error用来指示运行时环境发生的错误。
    例如,JVM内存溢出。一般地,程序不会从错误中恢复。
    异常类有两个主要的子类:IOException类和RuntimeException类。

    在Java 内置类中,有大部分常用检查性和非检查性异常。

    异常捕获

    使用try和catch关键字可以捕获异常。try/catch代码块放在异常可能发生的地方。
    try/catch代码块中的代码称为保护代码,使用 try/catch的语法如下:

    try
    {
       // 程序代码
    }catch(ExceptionName e1)
    {
       //Catch 块
    }

    catch语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try后面的catch块就会被检查。
    如果发生的异常包含在catch块中,异常会被传递到该catch块,这和传递一个参数到方法是一样。

    例如:

          try{
             int a[] = new int[2];
             System.out.println("Access element three :" + a[3]);
          }catch(ArrayIndexOutOfBoundsException e){
             System.out.println("Exception thrown  :" + e);
          }

    多重捕获块

    一个try代码块后面跟随多个catch代码块的情况就叫多重捕获。
    多重捕获块的语法如下所示:

     try{
        // 程序代码
     }catch(异常类型1 异常的变量名1){
        // 程序代码
     }catch(异常类型2 异常的变量名2){
        // 程序代码
     }catch(异常类型2 异常的变量名2){
        // 程序代码
     }

    上面的代码段包含了3个catch块。
    可以在try语句后面添加任意数量的catch块。
    如果保护代码中发生异常,异常被抛给第一个catch块。
    如果抛出异常的数据类型与ExceptionType1匹配,它在这里就会被捕获。
    如果不匹配,它会被传递给第二个catch块。
    如此,直到异常被捕获或者通过所有的catch块。

    例如:

    try
    {
       file = new FileInputStream(fileName);
       x = (byte) file.read();
    }catch(IOException i)
    {
       i.printStackTrace();
       return -1;
    }catch(FileNotFoundException f) //Not valid!
    {
       f.printStackTrace();
       return -1;
    }

    throws/throw/finally

    如果一个方法没有捕获一个检查性异常,那么该方法必须使用throws 关键字来声明。throws关键字放在方法签名的尾部。
    也可以使用throw关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
    下面方法的声明抛出一个RemoteException异常:

    import java.io.*;
    public class className
    {
       public void deposit(double amount) throws RemoteException
       {
          // Method implementation
          throw new RemoteException();
       }
       //Remainder of class definition
    }

    一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。

    finally关键字

    finally关键字用来创建在try代码块后面执行的代码块。
    无论是否发生异常,finally代码块中的代码总会被执行。
    在finally代码块中,可以运行清理类型等收尾善后性质的语句。
    finally代码块出现在catch代码块最后,语法如下:

     try{
        // 程序代码
     }catch(异常类型1 异常的变量名1){
        // 程序代码
     }catch(异常类型2 异常的变量名2){
        // 程序代码
     }finally{
        // 程序代码
     }

    注意下面事项:

    catch不能独立于try存在。
    在try/catch后面添加finally块并非强制性要求的。
    try代码后不能既没catch块也没finally块。
    try,catch, finally块之间不能添加任何代码。

    自定义异常

    在Java中你可以自定义异常。编写自己的异常类时需要记住下面的几点。

    所有异常都必须是Throwable的子类。
    如果希望写一个检查性异常类,则需要继承Exception类。
    如果你想写一个运行时异常类,那么需要继承RuntimeException 类。

    可以像下面这样定义自己的异常类:

    class MyException extends Exception{
    }

    只继承Exception 类来创建的异常类是检查性异常类。
    一个异常类和其它任何类一样,包含有变量和方法。

    在Java中定义了两种类型的异常和错误。

    JVM(Java虚拟机)异常:由JVM抛出的异常或错误。例如:NullPointerException类,ArrayIndexOutOfBoundsException类,ClassCastException类。
    程序级异常:由程序或者API程序抛出的异常。例如IllegalArgumentException类,IllegalStateException类。

  • 相关阅读:
    71. Simplify Path
    68. Text Justification
    65. Valid Number
    64. Minimum Path Sum
    More Effective C++ 条款12 了解”抛出一个exception"与“传递一个参数”或“调用一个虚函数”之间的差异
    More Effective C++ 条款11 禁止异常流出destructor之外
    More Effective C++ 条款10 在构造函数内阻止内存泄露
    More Effective C++ 条款9 利用 destructor 避免泄露资源
    More Effective C++ 条款7 千万不要重载&&,||和,操作符
    More Effective C++ 条款6 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式
  • 原文地址:https://www.cnblogs.com/lely/p/10179562.html
Copyright © 2011-2022 走看看