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

理解异常一

阅读更多

一.异常简介 

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块中给它赋值.

分享到:
评论

相关推荐

    异常底层详解

    理解异常的基础操作以及最简单的捕获处理 理解多异常捕获处理 理解声明抛出异常 掌握自定义异常 掌握异常处理注意事项 第1章 异常 什么是异常?Java代码在运行时期发生的问题就是异常。 在Java中,把异常信息封装成...

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

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

    理解.NET中的异常

    或许从第一次使用异常开始,我们就要经常考虑诸如何时捕获异常,何时抛出异常,异常的性能如何之类的问题,有时还想了解究竟什么是异常,它的机制又是什么。本文试着对这些问题进行讨论。

    异常处理(一)1

    第7章异 常 处 理大连理工大学大连理工大学主讲人-于红本章知识点理解异常处理机制异常异常处理的实现异常处理异常的类型匹配处理理解异常处理机制异常指计算机硬件或

    Local Outlier Factor(LOF)异常检测算法一维DEMO

    LOF异常检测算法一维DEMO, 找了好久没有找到,自己写了一个,可以帮助理解概念

    《深度理解Android:第一卷》

    《深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重...

    java 异常处理ppt

    深刻理解 java 语言中独特的异常处理机制,掌握处理问题的方法。异常处理是java语言中一个独特之处,主要使用捕获异常和声明抛弃异常两种方法来处理程序中可能出现异常的语句块。

    Java异常处理.md

    Java异常处理是编写健壮程序的关键方面之一。本资料将帮助您了解异常类层次结构、异常处理、抛出异常、自定义异常和最佳实践。 在Java中,异常被分为受检异常和非...通过该示例,您可以更好地理解异常处理的运作方式。

    java的自定义异常例子

    适合java初学者对java异常这一块的理解,加深对异常描述的印象

    深入理解Android卷1全

    深入理解Android 卷1 不是扫描版的,是全版电子书的,非PDF,可编辑,各种阅览器以打开!包括书签和同步目录! 第1章 阅读前的准备工作 / 1 1.1 系统架构 / 2 1.1.1 Android系统架构 / 2 1.1.2 本书的架构 / 3 1.2 ...

    对ARM异常(Exceptions)的理解

    ARM支持7种异常。问题时发生了异常后ARM是如何响应的呢?下面一起来学习一下

    精品课件-Python常见异常处理.pptx

    理解 掌握 掌握 掌握 学习目标 理解异常的概念 1 2 掌握处理异常的几种方式 掌握raise和assert语句,会抛出自定义的异常 3 4 掌握with和as环境安装器的使用 精品课件----Python常见异常处理全文共71页,当前为第2页...

    异常的详解文档

    异常的详细理解 对于入门这来说 可以站在一个理解者的角度详细地清晰地理解异常

    Android 全局异常捕获后台发送邮件

    网上找了很多资料都不能使用,后来自己参考写了这么一个 全局异常捕获并通过后台给指定的QQ邮箱发送 异常报告日志附件. 重点位置都已经注释了,其他的大家慢慢理解吧。 注意:QQ邮箱设置服务和生成授权码,...

    python——异常处理

    刚开始学习python很不容易理解,python在线教学中异常处理

    深入理解python异常处理(主要是利用try语句去捕获异常,那么什么是try语句,try语句怎么用,try语句有哪些功能。还会总结文件处理的方法)

    总结一下异常发生:1.不是代码的问题。 2.比如想要打开的文件不存在,想要处理的问题输入了一个异常值等等都会产生一个异常。 二.如何处理异常 对于异常的处理一般有两种方法。 第一种方法:增加新的逻辑,去处理这...

    Java 异常处理面试集锦及答案20道

    异常处理是Java编程中重要的概念和技巧之一,也是面试中常见的考点。本文提供了二十道常见的面试题,涵盖了Java异常处理的基本知识、异常类型、异常处理机制、关键字、异常链等方面。这些问题旨在考察候选人对Java...

    异常处理(二)1

    第7章异 常 处 理大连理工大学大连理工大学主讲人-于红本章知识点理解异常处理机制异常处理的实现异常处理异常的类型匹配处理异常的类型匹配使用throw语句抛出的

    异常以及异常处理框架探析

    :本文主要与您探讨异常以及异常处理相关方面的一些知识,主要包括检查异常与非检查异常的理解,多视角观察理解异常,进而探讨关于构建稳健且可扩展的异常框架方面的一些设计原则。一般情况下,企业级应用都对应着...

    深入理解JavaScript系列

    本书是一本全面、深入介绍JavaScript语言的学习指南。本书共分四个部分,第1部分帮助读者快速入手,掌握基本的JavaScript编程要点;第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法...

Global site tag (gtag.js) - Google Analytics