`
aijuans
  • 浏览: 1548186 次
社区版块
存档分类
最新评论

java提高篇-----异常(一)

 
阅读更多

     Java的基本理念是“结构不佳的代码不能运行”!!!!!

      大成若缺,其用不弊。

      大盈若冲,其用不穷。

      在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失。同样的道理,计算机的世界也是不完美的,异常情况随时都会发生,我们所需要做的就是避免那些能够避免的异常,处理那些不能避免的异常。这里我将记录如何利用异常还程序一个“完美世界”。

一、为什么要使用异常

      首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率。虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用。有异常就说明程序存在问题,有助于我们及时改正。在我们的程序设计当做,任何时候任何地方因为任何原因都有可能会出现异常,在没有异常机制的时候我们是这样处理的通过函数的返回值来判断是否发生了异常(这个返回值通常是已经约定好了的),调用该函数的程序负责检查并且分析返回值。虽然可以解决异常问题,但是这样做存在几个缺陷:

      1、 容易混淆。如果约定返回值为-11111时表示出现异常,那么当程序最后的计算结果真的为-1111呢?

      2、 代码可读性差。将异常处理代码和程序代码混淆在一起将会降低代码的可读性。

      3、 由调用函数来分析异常,这要求程序员对库函数有很深的了解。

      在OO中提供的异常处理机制是提供代码健壮的强有力的方式。使用异常机制它能够降低错误处理代码的复杂度,如果不使用异常,那么就必须检查特定的错误,并在程序中的许多地方去处理它,而如果使用异常,那就不必在方法调用处进行检查,因为异常机制将保证能够捕获这个错误,并且,只需在一个地方处理错误,即所谓的异常处理程序中。这种方式不仅节约代码,而且把“概述在正常执行过程中做什么事”的代码和“出了问题怎么办”的代码相分离。总之,与以前的错误处理方法相比,异常机制使代码的阅读、编写和调试工作更加井井有条。(摘自《Think in java 》)。

      在初学时,总是听老师说把有可能出错的地方记得加异常处理,刚刚开始还不明白,有时候还觉得只是多此一举,现在随着自己的不断深入,代码编写多了,渐渐明白了异常是非常重要的。

二、基本定义

      在《Think in java》中是这样定义异常的:异常情形是指阻止当前方法或者作用域继续执行的问题。在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因就是告诉你:这里可能会或者已经产生了错误,您的程序出现了不正常的情况,可能会导致程序失败!

      那么什么时候才会出现异常呢?只有在你当前的环境下程序无法正常运行下去,也就是说程序已经无法来正确解决问题了,这时它所就会从当前环境中跳出,并抛出异常。抛出异常后,它首先会做几件事。首先,它会使用new创建一个异常对象,然后在产生异常的位置终止程序,并且从当前环境中弹出对异常对象的引用,这时。异常处理机制就会接管程序,并开始寻找一个恰当的地方来继续执行程序,这个恰当的地方就是异常处理程序,它的任务就是将程序从错误状态恢复,以使程序要么换一种方法执行,要么继续执行下去。

     总的来说异常处理机制就是当程序发生异常时,它强制终止程序运行,记录异常信息并将这些信息反馈给我们,由我们来确定是否处理异常。

三、异常体系

      java为我们提供了非常完美的异常处理机制,使得我们可以更加专心于我们的程序,在使用异常之前我们需要了解它的体系结构:如下(该图摘自:http://blog.csdn.net/zhangerqing/article/details/8248186)。

1354439580_6933

      从上面这幅图可以看出,Throwable是java语言中所有错误和异常的超类(万物即可抛)。它有两个子类:Error、Exception。

      其中Error为错误,是程序无法处理的,如OutOfMemoryError、ThreadDeath等,出现这种情况你唯一能做的就是听之任之,交由JVM来处理,不过JVM在大多数情况下会选择终止线程。

      而Exception是程序可以处理的异常。它又分为两种CheckedException(受捡异常),一种是UncheckedException(不受检异常)。其中CheckException发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。而UncheckedException发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的,难以排查,我们一般都需要纵观全局才能够发现这类的异常错误,所以在程序设计中我们需要认真考虑,好好写代码,尽量处理异常,即使产生了异常,也能尽量保证程序朝着有利方向发展。

      所以:对于可恢复的条件使用被检查的异常(CheckedException),对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException)。

      java的异常类实在是太多了,产生的原因也千变万化,所以下篇博文我将会整理,统计java中经常出现的异常,望各位关注!!

四、异常使用

      在网上看了这样一个搞笑的话:世界上最真情的相依,是你在try我在catch。无论你发神马脾气,我都默默承受,静静处理。对于初学者来说异常就是try…catch,(鄙人刚刚接触时也是这么认为的,碰到异常就是try…catch)。个人感觉try…catch确实是用的最多也是最实用的。

      在异常中try快包含着可能出现异常的代码块,catch块捕获异常后对异常进行处理。先看如下实例:

复制代码
public class ExceptionTest {
    public static void main(String[] args) {
        String file = "D:\\exceptionTest.txt";
        FileReader reader;
        try {
            reader = new FileReader(file);
            Scanner in = new Scanner(reader);  
            String string = in.next();  
            System.out.println(string + "不知道我有幸能够执行到不.....");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("对不起,你执行不到...");
        }  
        finally{
            System.out.println("finally 在执行...");
        }
    }
}
复制代码

      这是段非常简单的程序,用于读取D盘目录下的exceptionText.txt文件,同时读取其中的内容、输出。首先D盘没有该文件,运行程序结果如下:

复制代码
java.io.FileNotFoundException: D:\exceptionTest.txt (系统找不到指定的文件。)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:106)
    at java.io.FileInputStream.<init>(FileInputStream.java:66)
    at java.io.FileReader.<init>(FileReader.java:41)
    at com.test9.ExceptionTest.main(ExceptionTest.java:19)
对不起,你执行不到...
finally 在执行...
复制代码

      从这个结果我们可以看出这些:

      1、当程序遇到异常时会终止程序的运行(即后面的代码不在执行),控制权交由异常处理机制处理。

      2、catch捕捉异常后,执行里面的函数。

      当我们在D盘目录下新建一个exceptionTest.txt文件后,运行程序结果如下:

1111不知道我有幸能够执行到不.....
finally 在执行...

      11111是该文件中的内容。从这个运行结果可以得出这个结果:不论程序是否发生异常,finally代码块总是会执行。所以finally一般用来关闭资源。

      在这里我们在看如下程序:

复制代码
public class ExceptionTest {
    public static void main(String[] args) {
        int[] a = {1,2,3,4};
        System.out.println(a[4]);
        System.out.println("我执行了吗???");
    }
}
复制代码

      程序运行结果:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at com.test9.ExceptionTest.main(ExceptionTest.java:14)

       各位请注意这个异常信息和上面的异常信息错误,为了看得更加清楚,我将他们列在一起:

java.io.FileNotFoundException: D:\exceptionTest.txt (系统找不到指定的文件。)
        Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4

      在这里我们发现两个异常之间存在如下区别:第二个异常信息多了Exception in thread "main",这显示了出现异常信息的位置。在这里可以得到如下结论:若程序中显示的声明了某个异常,则抛出异常时不会显示出处,若程序中没有显示的声明某个异常,当抛出异常时,系统会显示异常的出处。

       

      由于这篇博文会比较长,所以分两篇来介绍。下篇博文主要介绍Java异常的自定义异常异常链异常的使用误区使用异常注意地方以及try…catch、throw、throws。望各位看客关注!!!!

6
2
分享到:
评论
3 楼 在世界的中心呼喚愛 2013-12-03  
楼主标题,怎么画的!!!
2 楼 JCoder_2014 2013-12-03  
学习了, 继续关注
1 楼 宋建勇 2013-12-02  
不错,大有收益啊!

相关推荐

    Java提高篇——Java异常处理

    比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。异常发生的原因有很多...

    java数据结构原理 提高篇

    java特性,异常以及java 中的数据结构实现原理。例如hashmap的底层原理,treemap的底层原理,hashcode的作用。

    Java提高篇之异常(上)

    Java的基本理念是“结构不佳的代码不能运行”!...  首先我们可以明确一点是异常的处理机制可以确保我们程序的健壮性,提高系统可用率。虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用。有异常说明程

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

    Java语言程序设计教程(Java 7)——入门与提高篇05

    第5章对编码能力提升,包括异常处理、输入输出、集合框架、正则表达式、枚举类型和Annotation。异常处理,对程序中可能出现的异常情况进行处理;输入输出,对输入输出流和文件操作进行介绍;集合框架,介绍泛型与...

    从零开始学Java资源包

    全书内容分为六篇共23章,讲解了Java的各个方面,主要内容包括Java语言的环境配置、基本语法、流程控制语句、字符串处理、数组、面向对象、图形界面设计、输入/输出、异常处理、网络编程、数据库及Java Web基础JSP和...

    Java程序设计自学手册光盘

    第2篇为提高篇(第9章~第14章),主要介绍异常处理、I/O处理技术、线程技术、JDBC技术、Java Swing等一些高级开发技术,在本篇的最后还通过一个进销存管理系统对前面章节的内容进行了实践;第3篇为实例篇(第15章~第...

    《Java程序设计自学手册》源代码

    第2篇为提高篇 第9章 第14章 主要介绍异常处理 I O处理技术 线程技术 JDBC技术 Java Swing等一些高级开发技术 在本篇的最后还通过一个进销存管理系统对前面章节的内容进行了实践;第3篇为实例篇 第15章 第20章 主要...

    Java核心开发技术从入门到精通.谭贞军.扫描版.part2

    第16课到22课技术提高篇,分别讲解Java网络通信开发、HTML和XML、JSP、JavaBean和Servlet、数据库、JDBC技术和SQL语句;第23课和24课是综合应用篇,分别讲解了使用Java开发画图板和数据库项目——公司管理系统的方法...

    Java_Web编程新手自学手册.pdf

    第7~12章是提高篇,讲解了搭建Java Web开发环境,HTML,和XML,JSP指令和内置对象,标签和动作指令,Servlet详解,JavaBean组件技术等内容;第13~15章是数据库篇,讲解了数据库技术,使用JDBC连接数据库,数据库...

    Java服务器端开发面试.doc

    涉及到各种效率问题等,里面最好阅读一下源码 集合的遍历方法和使用iterator来遍历的区别,集合可否修改,能否删除其中的一 个元素,然后size是否变化等等问题 JAVA垃圾回收,内存结构 异常的种类 Object类,哪些...

    由浅入深学Java—基础、进阶与必做260题.pdf

    第4篇介绍了一个综合案例,让读者有提高的机会。 本书是一本Java编程自学手册,读者可以跟随书的讲解,边学习边上机,**在学完一章后,独立 做出每章的习题,这样可以带着问题学习,进步得会更快

    由浅入深学Java—基础、进阶与必做260题 高清pdf版

    第4篇介绍了一个综合案例,让读者有提高的机会。 《由浅入深学Java:基础、进阶与必做260题》是一本Java编程自学手册,读者可以跟随书的讲解,边学习边上机,最好在学完一章后,独立做出每章的习题,这样可以带着...

    JAVA程序设计与问题解决(高级篇).rar )

    本书主要讲述高级内容,包括异常处理、流和文件I/O、动态数据结构与泛型、递归等高级主题。本书使用了J2SE 5.0的最新特性,并且包含新的、可选讲的图形编程内容和贯穿全书的GUI材料。 本书可作为高等院校计算机及相关...

    Java核心开发技术从入门到精通.谭贞军.扫描版.part1

    第16课到22课技术提高篇,分别讲解Java网络通信开发、HTML和XML、JSP、JavaBean和Servlet、数据库、JDBC技术和SQL语句;第23课和24课是综合应用篇,分别讲解了使用Java开发画图板和数据库项目——公司管理系统的方法...

    java自学之道

    第二篇 提高篇 第3章 Java常用算法 3.1递归算法 3.2冒泡排序算法 3.3 快速排序算法 3.4选择排序算法 3.5直接插入算法 3.6希尔排序算法 3.7 二分查找算法 3.8 二叉树 3.9 图的实现 3.10 生产者消费者的实现 3.11 ...

    学通Java的24堂课

    第2部分 提高篇 第8堂课 类的继承与多态特性 219 第9堂课 其他类特性与异常处理 257 第10堂课 swing编程基础 283 第11堂课 多线程编程 319 第12堂课 事件处理的应用 345 第13堂课 常用工具类 373 第14堂课 ...

Global site tag (gtag.js) - Google Analytics