(根据http://www.imooc.com/learn/110 陈码农老师教学视频总结)

 

一.异常体系结构

所有不正常类都继承于Throwable类

1.异常两个子类 error & Exception

(1)Error类:

表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

(2)Exception类

(参考 http://bbs.itheima.com/thread-117155-1-1.html wanghe826的回答)

 

分为:runtime exception和checked exception。

面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常

try{

//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里

}catch(Exception e){

//处理该异常的代码块,发出警告、记录错误日志

}

 

【1】RuntimeException(非检查异常,运行时异常)

eg. 引用了空对象的属性或方法(空指针),数组访问越界、错误类型转换、除数0算数异常

运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一.

 

如果不对RuntimeException处理,出现运行时异常之后,要么是线程中止,要么主程序终止。

 

如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。

 

如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。

 

【2】检查(checked)异常 要手动捕获处理

检查异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。

二.异常处理

抛出多个异常(多重catch)

多个catch

try{

//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里

}catch(AritheticException e){

//处理算数为0的情况

}catch(Exception e){

// 处理该异常的代码块,发出警告、记录错误日志

//算数异常使Exception 的子类,按照父亲谦让儿子的顺序

}

 

注意:

顺序问题:先小后大,先子类、后父类,因为会自动找就近匹配的异常处理。上述Exception是上面异常的父类,所以放到最后,不然编译会报错。

finally善后工作

具体案例参考 http://www.cnblogs.com/haitao-fan/archive/2012/05/31/2528389.html

 

finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源

 

Try{

//会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里

}catch(AritheticException e){

//处理算数为0的情况

}catch(Exception e){

// 处理该异常的代码块,发出警告、记录错误日志

e.printStackTrace();

}finally{

//善后工作,最后要处理的代码

}

 

三.异常抛出throw

throws——声明将要抛出何种类型的异常

 

public void methodName(args1,args2)

throws 异常列表{

//调用会抛出的异常的方法或者throw new Exception()

}

 

例子

public void divide(int one, int two) throws Exception{

    if (two==0)

        throw new Exception("\"two\" can't be zero ");

    else

        System.out.println("the result is :"+one/two);

}

 

四.自定义异常

必须继承java标准类中意思相近的异常类型,或者Exception

class yourName extends ExceptionType{ }

 

 

五.异常链

把捕获的异常包装成新的异常,从新的异常添加对原始异常的引用

package com.imooc;

 

public
class ChainTest {

 

    /**

     * test1() 抛出drunk异常,

     * test2() 调用test1(),捕获drunk异常,并包装成运行时异常,继续抛出

     * main()调用test2(),尝试捕获test2抛出的异常

     */

    public
static
void main(String[] args) {

        ChainTest ct=new ChainTest();

        try {

            ct.test2();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

    public
void test1() throws DrunkException{

        throw
new DrunkException("喝酒别开车");    

    }

    

    public
void test2() {

        try {

            test1();

        } catch (DrunkException e) {

    RuntimeException newException = new RuntimeException("司机一滴酒,亲人两行泪");

            //调用含参构造器

            newException.initCause(e);//下面有解释

            throw newException;

        }

    }

}

 

解释newException.initCause(e)

出处 http://zy19982004.iteye.com/blog/1975986

  1. 现在所有Throwable的子类子构造器中都可以接受一个cause对象作为参数,这个cause就异常原由,代表着原始异常,即使在当前位置创建并抛出行的异常,也可以通过这个cause追踪到异常最初发生的位置。
  2. 只有Error,Exception,RunimeException提供了带cause参数的构造器,其他的所以异常就只有通过initCause()来设置cause了。

六.经验总结

  1. 多重catch后面加个catch(Exception),处理可能遗漏的异常
  2. 不确定的代码surrounded with try-catch,处理潜在异常
  3. 尽量处理异常,不要只用简单的调用printStackTrace()
  4. 尽量添加finally去释放占用资源

 

【java】异常和处理的更多相关文章

  1. 浅谈java异常[Exception]

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...

  2. 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    本文转载自  java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...

  3. Java异常体系及分类

    上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...

  4. Java异常之自定义异常

    哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异 ...

  5. 第11章 Java异常与异常处理

    1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...

  6. java 异常

    1.java异常 2.自定义抛出 3.运行时异常,程序有问题,让使用者可以改' ' 4.return  和  throw的区别 return 符合函数要求的值    throw  有问题的时候用它结束 ...

  7. 3.Java异常进阶

    3.JAVA异常进阶 1.Run函数中抛出的异常 1.run函数不会抛出异常 2.run函数的异常会交给UncaughtExceptionhandler处理 3.默认的UncaughtExceptio ...

  8. 2.Java异常学习

    1.Java异常的概念 异常的例子 1.除法就是一个需要捕获异常的例子,除数又可能是0 异常处理的基本流程如下 一旦发生异常,就使得程序不按照原来的流程继续的运行下去 a.程序抛出异常 try{ th ...

  9. java异常架构图 和几个面试题

    1.java异常架构图 粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被 ...

  10. 黑马----JAVA异常

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 黑马程序员--JAVA异常 一.JAVA异常有三种语句块:try语句块.catch语句块.finally语句块. 1.try语句 ...

随机推荐

  1. 几篇不错的基础css博客转载

    CSS 巧用 :before和:after:http://web.jobbole.com/85083/ css清除元素间距:http://ouvens.github.io/frontend-css/2 ...

  2. Annotation实战【自定义AbstractProcessor】

    前言 在使用Java的过程中,每个开发人员都接触过@Override, @Deprecated等等各式各样的注解,这些东西是java最基础的一些原生定义好的annotation.本文通过一个实例演示如 ...

  3. xcodeheader search 配置

    一般我们在xcode里面配置包含工程目录下头文件的时候,都要关联着相对路径和绝对路径,如果只是自己用这个项目,用绝对路径的问题不大,但是如果你把工程发给别人,别人就要在改这个绝对路径,这时候绝对路径的 ...

  4. 基于Node的PetShop,RESTful API以及认证

    前篇 - 基本认证,用户名密码 后篇 - OAuth2 认证 由于宠物店的业务发展需要,我们需要一种更加便捷的方式来管理日益增多的宠物和客户.最好的方法就是开发一个APP,我可以用这个APP来添加.更 ...

  5. Jnotify文件监控的用法以及Jar文件导入的方法

    简介Jnotiy, 支持动态监控(支持级联监控)文件夹和文件的jar包.在linux中,调用linux底层的jnotify服务.在windows中,需要添加附件的dll文件. 因为通用的Maven仓库 ...

  6. C# 多线程之一:信号量Semaphore

    通过使用一个计数器对共享资源进行访问控制,Semaphore构造器需要提供初始化的计数器(信号量)大小以及最大的计数器大小 访问共享资源时,程序首先申请一个向Semaphore申请一个许可证,Sema ...

  7. 不同分辨率的LCM进行兼容

    1.读取不同LCM ID的时序不同,如何处理? 2.开机后android会自动resize图片资源的大小,但开机logo无法自行resize,如何操作?保证识别到不同分辨率的LCM后开机logo可以正 ...

  8. Some Useful Property Settings Explained Of Oracle Forms

    In Oracle forms when we have two or more blocks and there is a requirement to join them or make a re ...

  9. linux下导入、导出mysql数据库命令

    一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql #/usr ...

  10. wince下的CPU和内存占用率计算

    #include <Windows.h> DWORD Caculation_CPU(LPVOID lpVoid) { MEMORYSTATUS MemoryInfo; DWORD Perc ...