`
atmosphere
  • 浏览: 14778 次
  • 性别: Icon_minigender_1
博客专栏
807a8b01-317a-34bf-9d0f-011a7c5a74b4
javase7官方教程翻译...
浏览量:11106
社区版块
存档分类
最新评论

理解异常一

阅读更多

一.异常简介 

Exception是"Exception Event"的简称.

 

当某个方法中产生了一个错误,这个方法将产生一个对象并传递给运行时系统.这个对象就叫做异常对象,它包含了错误的信息,它的类型以及发生错误时程序的运行状态.创建一个对象并把它传递给运行时系统的行为就叫做抛出异常(throwing an exception).

 

当异常发生后,运行时系统试图找到一个合适的异常处理器来处理这个异常.如何找呢?方法就是从异常发生的地方反向搜索调用栈(call stack),直到找到一个合适的处理器,那么我们说捕获了这个异常(catch the exception).什么才是一个合适的处理器呢?只要发生的异常与Catch块中声明的异常类型相同或者是其父类型,我们就说它是一个合适的处理器.如果在调用栈(call stack)中没有搜索到合适的异常处理器,运行时系统将会终止.

 

二.异常分类

第一种就是checked exception,是可预知的各种情况以及能迅速从错误中恢复过来的.例如,想象一个应用程序提示用户输入文件名,然后根据文件名构造一个java.io.FileReader对象,正常情况下,用户输入的是已经存在的并且可读的文件名,程序将会正常执行.然而当用户输入了一个错误的,不存在的文件名时,程序将会抛出一个java.io.FileNotFoundException 一个良好的程序就会提示出错了,让用户输入正确的文件名.

 

除了被Error,RuntimeException和它们的子类指明的,其余的Exception都是checked exception.是应用程序可以处理的异常.

 

 

第二种异常就是error,是应用程序不能预先知道并且恢复的.例如,当某个程序打开了一个文件作为输入,但是由于硬件或者操作系统出现故障,程序不能获取输入,那么将会抛出一个java.io.IOError.凡是被Error或其子类指定的就是error.

 

 

第三种就是runtime exception,就是那些程序不能预知的的内部错误.比如说程序的bugs,逻辑上的错误,或者错误的使用了API等.凡是被RuntimeException或其子类指定的就是runtime exception.

 

error和runtime exception都叫做unchecked exception.

 

三.捕获和处理异常

这个部分讲解如何使用异常处理组件(try,catch,finnally)来编写一个异常处理器.

 

下面的例子定义了一个ListOfNumbers类.在构造方法中创建了一个ArrayList对象,用于存放一个从0-9的数字列表.并定义了一个writeList方法,用于将数字列表输出到一个叫OutFile.txt的文本文件中.

 

//Note: 这个类故意被设计成不能被编译的
import java.io.*;
import java.util.List;
import java.util.ArrayList;

public class ListOfNumbers {

  private List<Integer> list;
  private static final int SIZE = 10;

  public ListOfNumbers () {
    list = new ArrayList<Integer>(SIZE);
      for (int i = 0; i < SIZE; i++) {
        list.add(new Integer(i));
    }
  }

  public void writeList() {
    PrintWriter out = new PrintWriter(
      new FileWriter("OutFile.txt"));

    for (int i = 0; i < SIZE; i++) {
      out.println("Value at: " + i + " = " + list.get(i));
    }
    out.close();
  }
}
 

 

new FileWriter("OutFile.txt"));

这行代码调用了一个构造方法用于初始化一个输出流,如果文件不能被打开,这个构造方法将会抛出一个 IOException.

 

 

out.println("Value at: " + i + " = " + list.get(i));

这行代码调用了ArrayList的get方法,如果传给它的参数太小或者太大都会抛出一个IndexOutOfBoundsException.

 

 

如果你想编译这个类,编译器将会打印出关于FileWriter抛出的异常信息,而不会打印get方法抛出的异常信息.原因是IOException是一个checked exception, IndexOutOfBoundsException 是一个unchecked exception.

 

 

 

try块:

第一步就是将可能抛出异常的代码封装在一个try块中.

     try{

          code

     }

     catch块和finnally块

 

你可以在每行可能抛出异常的代码外加上一个try,catch块,也可以在多行中只使用一个try,catch块.本例中使用的第二种方式.

 

private List<Integer> list;
private static final int SIZE = 10;

PrintWriter out = null;

try {
    System.out.println("Entered try statement");
    out = new PrintWriter(new FileWriter("OutFile.txt"));
    for (int i = 0; i < SIZE; i++) {
        out.println("Value at: " + i + " = " + list.get(i));
    }
}
catch and finally statements . . .


 catch块:

通过直接在try块之后增加一个或者多个catch块来与try块进行关联,在try块和第一个catch块之间不能有任何其他代码.

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

 没一个catch块都是一个异常处理器,用来处理其参数指明的异常类型或其子类型.

如果异常处理器被调用,改catch块中的代码将会执行.

 

下面是两个writeList方法的两个异常处理器

try {

} catch (FileNotFoundException e) {
    System.err.println("FileNotFoundException: "
                        + e.getMessage());
    throw new SampleException(e);

} catch (IOException e) {
    System.err.println("Caught IOException: "
                        + e.getMessage());
}

 两个异常处理器都打印错误消息,第二个出了这个什么也不做,只是让程序继续执行.第一个处理器打印错误消息并抛出一个用户自定义异常.在这个例子中,如果FileNotFoundException被捕获将会倒值SampleException被抛出,如果你想让你的程序在这种情况下用一种特定的方式处理,那么你也可以这么做.

 

异常处理器不仅仅能打印错误信息和终止程序,还可以从错误中恢复,提示用户,或者通过exception链传到更高级别的处理器去处理.

 

在一个处理器中捕获多个异常:

在java7中,一个catch块中可以处理不止一种异常.这个特性使得我们可以减少很多重复代码.多个exception用

"|"分隔.

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

 注意:如果使用这种方式,ex将是final的,你不能在catch块中给它赋值.

分享到:
评论

相关推荐

    深入理解java异常处理机制

    1. **`testEx2`** 方法中的 `finally` 块被执行后,返回了一个布尔值 `false`,这导致了 `testEx1` 方法中的 `finally` 块也输出了 `false` 的返回值,而不是在 `catch` 块中抛出异常。 2. **`testEx1`** 方法中的 ...

    深入理解java异常(异常中的Error+异常中的Exception+检查异常+运行时异常+异常处理+throws关键字等)

    try 块中放置可能会发生异常的代码,当异常发生时,try 块抛出系统自动生成的异常对象,然后异常处理机制将负责搜寻参数与异常类型相匹配的第一个处理程序,并执行 catch 语句。 throws 关键字用于在方法签名中声明...

    理解异常处理

    【理解异常处理】 异常处理是编程中不可或缺的一部分,特别是在Java这样的强类型语言中。Java的异常处理机制旨在增强程序的健壮性和可维护性,帮助开发者有效地管理和修复程序运行时可能出现的问题。Java的异常处理...

    MonteCarlo.rar_Monte Carlo_剔除异常值_异常值_异常样本剔除_蒙特卡洛 异常

    总之,蒙特卡洛方法为处理异常值提供了一种有力的工具,它允许我们在大量随机抽样中理解数据的内在结构,从而更准确地识别和剔除异常值。然而,这种方法也有其局限性,例如假设数据分布,因此在实际应用中应结合业务...

    理解.NET中的异常

    总的来说,理解.NET中的异常机制对于编写健壮、易于维护的代码至关重要。正确地使用异常,结合异常的本质和.NET提供的异常类,可以提高代码质量,同时确保在遇到错误时能够及时恢复或提供有用的错误信息。

    深入理解LINUX内核(中文第三版)第四章 中断和异常

    在深入理解Linux内核第四章中,作者详细阐述了Linux内核中中断和异常的概念、分类、处理机制以及它们在系统运行中的重要性。本章不仅涉及了Intel微处理器手册中对中断和异常的分类方法,还探讨了Linux内核如何初始化...

    深入理解java异常处理机制Java开发Java经验技巧共

    Java异常处理机制是Java编程中不可或缺的一部分,它提供了一种有序地处理程序错误和异常情况的方法。这篇19页的PDF文档《深入理解java异常处理机制Java开发Java经验技巧共》可能涵盖了Java异常处理的基本概念、最佳...

    C#异常处理总结及简单实例

    一、异常处理的理解? 异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。 因此处理这种错误,就称为异常处理。 二、异常处理如何操作? C# 异常处理时建立在四个关键词之上的:try、...

    C# 捕获C/C++异常的例子

    我们定义了一个结构体`MyException`来表示C++异常,并通过`DllImport`特性导入该函数。 接下来,我们可以使用`try-catch`块来捕获可能的异常: ```csharp try { MyException ex; MyCppFunction(out ex); if (ex...

    全面理解java中的异常处理机制

    Java中的异常处理机制是编程过程中不可或缺的一部分,它用于处理程序运行时出现的错误或不正常情况。...理解并熟练运用异常处理,不仅可以提高代码质量,还能帮助开发者更好地应对复杂编程环境中的各种挑战。

    java异常 异常的概念 应用

    1. 异常是一种事件,当它发生时,会中断正常的程序流程。这种事件可能是由于资源不足、非法操作、逻辑错误或者外部条件不符合预期导致的。 2. Java中的异常是对象,它们都是`java.lang.Throwable`类的实例或其子类的...

    易语言HOOK异常处理

    "New_SE_Handler"可能是一个新的结构化异常处理程序,结构化异常处理(SEH)是Windows操作系统中的一个特性,用于处理硬件和软件异常。 "GetSeAddr"可能是获取异常发生时的地址函数,这对于分析异常原因和定位问题...

    SEH异常处理.rar

    4. **异常传播**:理解异常是如何从发生的地方向栈顶传播,直到找到合适的处理函数,或者导致程序终止。 5. **嵌套异常处理**:理解如何在一个`TRY`-`EXCEPT`结构内部再嵌套其他`TRY`-`EXCEPT`,以便更灵活地处理...

    java 自定义异常实例二

    配合图片`Java.jpg`,可能展示的是Java代码编辑器中的一个截图,或者是一个异常处理流程的可视化表示,帮助理解自定义异常在实际项目中的应用。 总的来说,自定义异常是Java开发中不可或缺的一部分,它们提供了更...

    深入理解Java异常体系Java系列2021.pdf

    1. 为什么使用异常? 异常处理机制的主要目的是在程序遇到不可预见的问题时,能够优雅地处理错误而不是让程序崩溃。通过异常,程序可以中断执行流程,记录并传递错误信息,以便在合适的时机进行处理。相比于传统的...

    关于Java异常处理机制的深入理解.doc

    在实际编程中,理解Java异常处理机制的这些细节至关重要,因为它可以帮助我们编写更加健壮和易于维护的代码。合理的异常处理可以防止程序崩溃,提供有用的错误信息,并允许程序优雅地处理错误情况。

    易语言线程结构异常处理

    在易语言中,线程是并发执行的程序单位,线程结构异常处理是编程过程中非常重要的一环,因为线程可能会遇到各种异常情况,如内存访问错误、除零异常等。 线程结构异常处理源码是易语言中处理这些异常的关键部分。当...

    异常处理.pdf

    Java异常机制是Java语言的一种错误处理方式,它提供了一种标准的方法来处理程序运行时可能出现的错误。通过异常处理,我们可以将正常业务代码和...同时,通过阅读和理解异常堆栈跟踪信息,可以更有效地定位和解决问题。

    易语言SEH异常处理

    `GetEip`函数允许程序员获取当前EIP的值,这对于理解异常发生的具体位置以及分析异常原因非常有帮助。 4. **JMP指令**:在异常处理中,`JMP`指令常用于跳转到异常处理程序。当异常发生时,控制流会通过`JMP`指令...

Global site tag (gtag.js) - Google Analytics