从開始学习VB,就听说过“异常”,认为异常处理就是加上try..catch,不让错误抛出给用户,到此为止,不要再往下问了,再问也不会了。这就是那时候的理解。如今随时项目经验的增多和Java基础的学习,对于“异常处理”有了一些不一样的感触,现写出和大家分享。

                                               Java异常:基础知识                                                       

(1)异常和错误

在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和执行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,给你一次改动的机会。Java中使用异常类来表示异常,不同的异常类代表了不同的异常。可是在Java中全部的异常都有一个基类,叫做Exception。

而与异常相应的错误Error则是指一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。错误是VM的一个故障(尽管它能够是不论什么系统级的服务),比方内存溢出。和异常一样,在Java中用错误类来表示错误,不同的错误类代表了不同的错误。可是在Java中全部的错误都有一个基类,叫做Error。

(2)异常的结构分类

主要包含执行时异常编译时异常。执行时异常即RuntimeException是指未检查的错误,是程序猿处理的一大难点;而编译时异常则是已检查的错误。

上述介绍中有提到,Java中不同的异常类代表了不同的异常。关于执行时异常主要有下面几个子类:

    1、
java.lang.ArrayIndexOutOfBoundsException

    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

    2、java.lang.ArithmeticException

    算术条件异常。譬如:整数除零等。

    3、java.lang.NullPointerException

    空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、訪问null对象的属性、计算null对象的长度、使用throw语句抛出null等等

    4、java.lang.ClassNotFoundException

    找不到类异常。当应用试图依据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到相应名称的class文件时,抛出该异常。

RuntimeException与Error能够在不论什么代码中产生,它们不须要由程序猿显示的抛出,一旦出现错误,那么对应的异常会被自己主动抛出。而已检查异常是由程序猿抛出的,这分为两种情况:客户程序猿调用会抛出异常的库函数(库函数的异常由库程序猿抛出);客户程序猿自己使用throw语句抛出异常。

遇到Error,程序猿通常是无能为力的;遇到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行改动(相当于调试的一种方法),而了解上述基本的四种RuntimeException分类,使我们针对性更强的去调试和改动我们的逻辑错误;仅仅有已检查异常才是程序猿所关心的,程序应该且仅应该抛出或处理已检查异常。

                                               Java异常:处理方式                                                       

了解Java的异常之后,就须要知道该怎样处理了。Java异常处理的主要流程例如以下:

① 遇到错误,方法马上结束,并不返回一个值;同一时候,抛出一个异常对象 。
② 调用该方法的程序也不会继续运行下去,而是搜索一个能够处理该异常的异常处理器,并运行当中的代码 。

    处理方式有下面两种:

(1)捕捉

对于捕捉方式,Java有针对性的处理方式,也就是我们常说的try…catch:

try {

//须要被检測的代码;

}

catch(异常类 变量名){

//异常处理代码;

}

fianlly{

//一定会运行的代码;主要让用户关闭资源。不管是否发生异常,资源都必须进行关闭。

}

而在程序中,我们通常使用下面方式来显示异常信息:

catch (Exception e) {      //e用于接收try检測到的异常对象。

  System.out.println("message:"+e.getMessage());    //获取的是异常的信息。

System.out.println("toString:"+e.toString());    //获取的是异常的名字+异常的信息。

  e.printStackTrace();     //打印异常在堆栈中信息;异常名称+异常信息+异常的位置。

}

(2)抛出

1.抛出异常的方法

在方法声明中,加入throws子句表示该方法将抛出异常。带有throws子句的方法的声明格式例如以下:

[<修饰符>]<返回值类型><方法名>([<參数列表>])[throws<异常类>]

当中,throws是keyword,<异常类>是方法要抛出的异常类,能够声明多个异常类,用逗号隔开。

public void  test(byte  a) throws Exception {    /抛出异常
try{ if(a>Byte.MAX_VALUE/i) //Integer类的常量,表示最大值
        throw new Exception("overflow");  //溢出时抛出异常
} catch(Exception e){ System.out.println("exception:"+e.getMessage()); e.printStackTrace();

怎样确定抛出何种异常呢?对于一个异常对象,真正实用的信息时异常的对象类型,而异常对象本身毫无意义。比方一个异常对象的类型是ClassCastException,那么这个类名就是唯一实用的信息。所以,在选择抛出什么异常时,最关键的就是选择异常的类名可以明白说明异常情况的类。

2.由调用方法处理异常

假设某个方法声明抛出异常,则调用它的方法必须捕获及处理异常,否则会出现异常错误,注意就可以不再多说。

说明了两种方式之后,我们就须要想一想了,为什么要声明方法抛出异常呢?能够说,方法是否抛出异常与方法返回值的类型一样重要。如果方法抛出异常却没有声明该方法将抛出异常,那么程序猿能够调用这种方法并且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决,就会出现意料之外的不友好页面了。

使用异常非常方便,所以有些程序猿一般不再愿意编写处理错误的代码,而不过简简单单的抛出一个异常。这样做是不正确的,对于全然已知的错误,应该编写处理这样的错误的代码,添加程序的健壮性。另外,异常机制的效率非常差,不宜过分使用。

以上对Java异常的基础知识和处理方式进行了大概的描写叙述,还有不尽如意的地方,继续慢慢领悟!



Java之旅(一)---说说“异常”那些事的更多相关文章

  1. JAVA之旅(十一)——RuntimeException,异常的总结,Package,jar包,多线程概述

    JAVA之旅(十一)--RuntimeException,异常的总结,Package,jar包,多程序概述 继续JAVA之旅 一.RuntimeException 在Exception种有一个特殊的子 ...

  2. JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

    JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间 ...

  3. java提高篇(十六)-----异常(一)

         Java的基本理念是“结构不佳的代码不能运行”!!!!! 大成若缺,其用不弊. 大盈若冲,其用不穷. 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因 ...

  4. JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!

    JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...

  5. JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

    JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...

  6. JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符

    JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...

  7. JAVA之旅(十九)——ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习

    JAVA之旅(十九)--ListIterator列表迭代器,List的三个子类对象,Vector的枚举,LinkedList,ArrayList和LinkedList的小练习 关于数据结构,所讲的知识 ...

  8. JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

    JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...

  9. JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算

    JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...

随机推荐

  1. Linux学习之chage命令

    功能:修改帐号和密码的有效期限用法:chage[-l][-m mindays][-M maxdays][-I inactive][-E expiredate][-W warndays][-d last ...

  2. hdu 4455 Substrings(找规律&DP)

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. linux杂记(六)档案权限

    [KANO@kelvin ~]$ ls -al 总用量 drwx------. KANO KANO 10月 : . drwxr-xr-x. root root 9月 : .. drwxrwxr-x. ...

  4. Android 实现GIF播放(解码)

    实现原理很简单,先把GIF动画解码成多张Bitmap图片,然后放到AnimationDrawable里面去逐一播放即可. GifHelper代码: package com.android.view; ...

  5. ffmpeg用法

    1. help ffmpeg.exe -h > help.txt 2. 解码: ffmpeg -i 123.264 123.yuv ffmpeg -i 123.264 -vframes 200  ...

  6. 完美解决CTRL+空格不能切换中/英文输入法的问题

    首先任务栏上的输入法图标上点右键选择设置. 然后选择键设置,双击第一个“在不同的输入语言之间切换”先勾选“切换输入语言”下面选择左手ALT.取消右边“切换键盘布局”前的勾. 然后进入“中文(简体)输入 ...

  7. makefile简单helloworld

    最近要在unix系统上开发c++应用程序,但默认情况下unix编译c++程序需要使用makefile.其实makefile语法还是比较简单,看上去有点像ant.废话不说了,直接上helloworld. ...

  8. .net 微信APP支付接口的开发流程以及坑

    流程 申请APP的微信支付 申请成功之后得到APPID 商户号 以及自己设置商户号的支付密码 这时就可以开发接口了 微信APP支付API:https://pay.weixin.qq.com/wiki/ ...

  9. c#软件工程师笔试题

    近来有打算重新找工作,还没提离职,投了几家公司简历,其中一家比较中意的公司给发了面试题,其实,好像是好几天前的事了,主要是Gmail邮箱很少用,所以一直都没去看,今天看到题目给解了. 题目如下: 题目 ...

  10. ES配置详解

    elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来 ...