类 

Throwable类

      Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw语句抛出。类似地,只有此类或 其子类之一才可以是 catch子句中的参数类型。

  1. Exception子类(异常)
  2. Error子类(错误):合理的应用程序不应该试图捕获的严重问题

Exception+Error

Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error

  1. 可查

    • Exception中除RuntimeException以外
    • 需要用try-catch捕获或者用throws子句声明抛出
  2. 不可查
    • RuntimeExceiption+错误
    • 编译器不要求强制处理

Exception

  • 运行时异常RuntimeException)

    • 可以捕获处理,也可以不处理,可以由虚拟机接管。由运行时系统自动抛出,不需要使用throw语句。
    • 常见的有:

      ClassCastException(类转换异常)

      IndexOutOfBoundsException(数组越界)

      NullPointerException(空指针)

      ArrayStoreException(数据存储异常,操作数组时类型不一致)

      BufferOverflowException(IO操作中缓存溢出异常)

  • 非运行时异常(编译异常):必须进行处理的异常,如果不处理,则编译不能通过

 try-catch捕获 

 try{
//可能抛出异常的代码
}catch(Exception1 e1){
//处理异常
}catch(Exception2 e2){
//一般Exception2是Exception1的父类
}
  • 匹配原则:如果抛出的异常对象属于catch子句的异常类或该类的子类,则认为生成的异常对象与catch块捕获的异常类型相匹配
  • try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句
  • try捕获到异常,catch语句块里没有处理此异常的情况:此异常将会抛给JVM处理,执行finally语句,但finally后的语句不会被执行
  • try捕获到异常,catch语句块里有处理此异常的情况
    • 在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块
    • 与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行
    • try语句块中,出现异常之后的语句也不会被执行
    • catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句

 finally语句 

 try{
2 //可能抛出异常的代码
}catch(Exception e){
//处理异常
}finally{
//最后会执行的代码
}

finally块

  • 无论是否捕获或处理异常,finally块里的语句都会被执行
  • 当在try块或catch块遇到return语句时,finally语句块将在方法返回之前被执行
  • 可嵌套try-catch-finally 结构,也就是在 try-catch-finally 结构中,可重新抛出异常
  • 在finally中不要用return,否则会发生异常丢失。(下面是相关的一个小例子)
 class ExceptionTest{
public static void fun_2() throws Exception{
try{
System.out.println("fun_2 try");
throw new Exception();
}catch(Exception e){
System.out.println("fun_2 catch");
throw e;//向fun_1再次抛出异常
}finally{
System.out.println("fun_2 finally");
return;//导致异常丢失,fun_1不会捕捉到异常
}
}
public static void fun_1() throws Exception{
try{
System.out.println("fun_1 try");
fun_2();//fun_2中抛出异常
}catch(Exception e){//这里不会捕捉到异常
System.out.println("fun_1 catch");
throw e;
}
}
public static void main(String[] args) {
try{
fun_1();
System.out.println("main try end");
}catch (Exception e) {
e.printStackTrace();
System.out.println("main catch");
}
}
}

执行结果:

fun_1 try

fun_2 try

fun_2 catch

fun_2 finally

main try end

  • 在以下4种特殊情况下,finally块不会被执行

    • 在finally语句块中发生了异常
    • 在前面的代码中用了System.exit()退出程序
    • 程序所在的线程死亡
    • 关闭CPU

throws抛出异常

  • 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常
  • throws语法格式为:void funname(type parameter) throws Exception1,Exception2,..,ExceptionN (异常列表)
  • 抛出异常语句:throw new Exception("Wrong")。如果该语句不在try语句块中,则该方法必须声明抛出异常,否则就是没有被捕获的异常
  • 方法抛出异常列表的异常时,方法不处理这些类型及其子类类型的异常,而抛向调用该方法的方法,由它去处理
  • throws关键字将异常抛给调用后,调用者必须处理;如果调用者不想处理该异常,应该继续向上抛出
  • 调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类

java学习——异常处理的更多相关文章

  1. Java学习---异常处理的学习

    基础知识 任何一门计算机程序设计语言都包括有绝对正确和相对正确的语句.绝对正确: 指任何情况下, 程序都会按照流程正确执行:相对正确: 程序的运行受到运行环境的制约, 在这种情况下, 需要附加检测和控 ...

  2. Java学习--异常处理及其应用类

    异常是运行时在代码序列中引起的非正常状况,换句话说,异常是运行时错误.在不支持异常处理的计算机语言中,必须手动检查和处理错误----通常是通过使用错误代码,等等.这种方式既笨拙又麻烦.Java的异常处 ...

  3. Java学习---异常处理

    import java.util.Scanner; public class MyExceptionTest { public static void check(Square A) throws W ...

  4. java学习——异常处理机制

    public class ExceptionDemo2 { public static void main(String[] args) { // TODO Auto-generated method ...

  5. Java 学习(10):java 异常处理

    java 异常处理 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 三种类型的异常: 检查性异常: 最具代表的检查性异 ...

  6. JAVA学习之 异常处理机制

    今天就来说说java的异常处理机制,异常处理不是第一接触,尤其是写过非常多c#的代码,基本都会写到异常处理的代码,事实上c#的异常处理与java的异常处理基本都是一样的,仅仅是在一些细节上不是非常一样 ...

  7. Java 学习笔记(11)——异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.ou ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. 关于JAVA学习计划和感想

    学习计划第一阶段:    JAVA语言基础知识.包括异常.IO流.多线程.集合类.    要求:异常------掌握try-catch-finally的使用          IO流------掌握字 ...

随机推荐

  1. Git 命令解释优秀博文转摘

    git rebase http://blog.csdn.net/hudashi/article/details/7664631 git merge git reset http://www.cnblo ...

  2. c文件操作

    文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件, 例如源程序文件.目标文件.可执行文件.库文件 (头文件)等. ...

  3. Java中常见的锁分类以及对应特点

    对于 Java 锁的分类没有严格意义的规则,我们常说的分类一般都是依据锁的特性.锁的设计.锁的状态等进行归纳整理的,所以常见的分类如下: 公平锁和非公平锁:公平锁是多线程按照锁申请的顺序获取锁,非公平 ...

  4. Loadrunner 如何在其他浏览器进行录制(一)

    背景: 由于lr只支持低版本的IE浏览器,当我们想使用高版本或其他浏览器进行录制时,这时,我们需要用到浏览器的代理功能. 传统的访问模式如下: 使用代理后的访问方式: 下面来总结一下具体的步骤: 1. ...

  5. wx小程序-列表详细页点击跳转!

    1.因为template 只是单纯的占位符,所以事件要写在外层view上面 2.通过自定义属性来判断 跳转的是那篇文章  自定义属性    (data-自定义名称 ) 3. 执行 onpostTap方 ...

  6. openstack Q版部署-----环境搭建(1)

    浏览器建议全程使用火狐或者谷歌,不然VNC可能会有问题 一.环境准备 系统:centos7.2 x86_64 controller 2c+8g+40g 10.1.80.110 可以nat上网 comp ...

  7. android xml组建圆角背景设置

    1.实现左边圆角,右边直行的方法: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:a ...

  8. CF1139B Chocolates

    题目地址:CF1139B Chocolates 前一个必须要少于后一个,那么模拟+贪心即可 倒序模拟,每次在上次取的个数减一和这次可以取的最多数量之间取min 直到为0(注意不要减到负数) 再就是注意 ...

  9. SpringSecurity基于数据库RBAC数据模型控制权限

    ⒈通用RBAC(Role - Based Access Control)数据模型 ⒉如何使用 1. package cn.coreqi.ssoserver.rbac; import org.sprin ...

  10. 【转】Python基础-封装与扩展、静态方法和类方法

    [转]Python基础-封装与扩展.静态方法和类方法 一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数 ...