异常

  Java代码在运行时期发生的问题就是异常。

异常的继承体系

  

  查阅API发现Exception 类及其子类是 Throwable 的一种形式,它用来表示java程序中可能会产生的异常,并要求对产生的异常进行合理的异常处理。继续观察,我们可以发现Exception有继承关系,它的父类是Throwable。Throwable是Java 语言中所有错误或异常的超类,即祖宗类。

异常继承体系总结

  Throwable: 它是所有错误与异常的超类(祖宗类)

  |- Error 错误

  |- Exception 编译期异常,进行编译JAVA程序时出现的问题

    |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题  

异常的产生过程

  这是一个普通的数组下标越界异常的产生过程;

抛出异常throw

  在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。

  在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?

  1,创建一个异常对象。封装一些提示信息(信息可以自己编写)。

  2,需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象;

  throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

使用格式:

throw new 异常类名(参数)

例如:

package com.oracle.demo01;public class ExceptionDemo2 {
/** 异常:编译时期异常:只要调用了抛出异常的方法没有处理,就会编译失败*                         如果出现编译时期异常处理方式(try throws)*             运行时期异常:方法内部抛出异常是运行异常 new XXXXException*                             如果是运行异常,它不会编译失败,方法声明不需要throws,调用者不需要处理*                             一旦发生,不要处理,修改源代码,没有执行的意义*                     RuntimeException及其他的子类* */public static void main(String[] args) {//定义一个方法,计算圆的面积double area=getArea(0);System.out.println(area);}public static double getArea(double r) {if(r<=0) {throw new RuntimeException("传入的值不符合要求");}return Math.PI*r*r;}
}

声明异常throws

声明:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。

/** throw 后边加的是异常对象* throws后边加的是异常类名,并写在方法声明上* 作用:告诉调用者此方法可能出现异常,需要处理* * */public static int getArray(int[] arr) throws Exception{if(arr==null) {throw new Exception("你传进来的数组是空的");}if(arr.length<3) {throw new Exception("你传的数组长度太小了,请传三个以上");}int i=arr[3];return i;} 

捕获异常try…catch…finally

  try:该代码块中编写可能产生异常的代码。

  catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。

  finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

  捕获异常格式

/** try{* 被监测的代码* 可能出现异常的代码* }catch(异常类名 变量名){* 异常处理方式* }finally{* 必须要执行的代码* }* 作用:try监测到了有异常发生,接收到一个异常对象,* 将异常对象抛给catch代码块处理,catch捕获到了这个异常对象,那么就执行处理方式代码* * */

多catch情况下的顺序问题:

package com.oracle.demo01;public class NullExceptionDemo {
/** 多catch顺序问题* 1.如果异常是平级的情况下(没有继承关系)* NullPointerException*             extends RuntimeException* ArrayIndexOutOfBoundsException extends*             IndexOutOfBoundsException extends RuntimeException * 顺序可以随便写* 2.如果有继承关系,要把小辈的放在前边,大辈放在后边* Exception * NullPointerException* */public static void main(String[] args) {int[] arr= null;try {int i=getArray(arr);System.out.println(i);}catch(NullPointerException ex) {System.out.println(ex.getMessage());//打印传入的字符串
                ex.printStackTrace();//printStackTrace()打印的是完整的异常信息,类名+字符串+报错位置}catch(ArrayIndexOutOfBoundsException ex) {System.out.println(ex.toString());//打印的是完整异常类名+传入的字符串}finally {//finally经常用于释放资源System.out.println("fianlly必须要执行的代码");}System.out.println("GameOver");}public static int getArray(int[] arr) throws NullPointerException,ArrayIndexOutOfBoundsException{if(arr==null) {throw new NullPointerException("你传的数组为null");}if(arr.length<3) {throw new ArrayIndexOutOfBoundsException("你传的数组长度不够");}return arr[3];}
}

异常在方法重写中细节

package com.oracle.demo01;public class OverideDemo {public static void main(String[] args) {}
}
/** 当父类中有异常方法的时候* 子类集成父类重写这个方法的时候,注意以下几点:* 1.子类可以选择不抛出,但是如果子类选择抛出异常,那么抛出的异常类不得超过父类的异常*             可以是父类的异常,也可以是父类异常的子类* 2.假如父类方法中没有抛异常,子类重写这个方法也不可以抛出异常* 3.假如父类方法中没有抛异常,但是子类重写这个方法时,在方法中调用了抛出异常的方法,*             那么你只有一个选择,就是try catch处理这个异常,不能throws* */
class Fu{public void FuMethod() {}
}
class Zi extends Fu{public void FuMethod(){try {method();}catch(Exception e){}}public void method() {}
}

异常中的常用方法

  getMessage方法:返回该异常的详细信息字符串,即异常提示信息

  toString方法:返回该异常的名称与详细信息字符串

  printStackTrace:在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

自定义异常

class MyException extends Exception{/**为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。*/public MyException(){super();}public MyException(String message)    {super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
    }
}

继承Exception,必须要throws声明,一声明就告知调用者进行捕获,一旦问题处理了调用者的程序会继续执行。

继承RuntimeExcpetion,不需要throws声明的,这时调用是不需要编写捕获代码的,因为调用根本就不知道有问题。一旦发生NoAgeException,调用者程序会停掉,并有jvm将信息显示到屏幕,让调用者看到问题,修正代码。

转载于:https://www.cnblogs.com/boringLee/p/9054565.html

JAVA学习笔记(十九)相关推荐

  1. Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法

    Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...

  2. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

  3. Java学习笔记十(注解)

    1.介绍 注解是JavaSE5.0開始提供的一项新特性,利用此特性能够通过特定的注解标签为程序提供一些描写叙述性信息. 这些描写叙述性信息能够在编译或执行时为编译器.执行环境提供附加的信息.从而简化开 ...

  4. java学习笔记(十二)----集合

    集合类 集合类用于存储一组对象,其中的每个对象称之为元素,经常会用以的有Vector,Enumeration,ArrayList,Collection,Iterator,Set,List等集合和接口 ...

  5. Java学习笔记(九)--数组及Arrays类

    数组 数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合.就是说数组中的每个元素具有相同的数据类型.在Java中将 ...

  6. Java学习笔记十五

    26. 下面介绍synchronized代码块,个人以为,重要度远远高于单纯的修饰synchronized方法: 一方面:高效率! 另一方面:后面涉及到的wait和notify方法,都要涉及 Sync ...

  7. java学习笔记十二

    1. Java IO 主要分为字节流(byte stream) 字符流          (characterstream) 实现这两种流的输入流与输出流分别是 InputStream OutputS ...

  8. 【theano-windows】学习笔记十九——循环神经网络

    前言 前面已经介绍了RBM和CNN了,就剩最后一个RNN了,抽了一天时间简单看了一下原理,但是没细推RNN的参数更新算法BPTT,全名是Backpropagation Through Time. [注 ...

  9. 【Java学习笔记十】输入输出流

    在Java.io包中提供了一系列用于处理输入/输出的流类.从功能上分为两类:输入流和输出流.从六结构上可分为:字节流(以字节为处理单位)和字符流(以字符为处理单位). 字符是由字节组成.在Java中所 ...

  10. Java学习系列(十九)Java面向对象之数据库编程

    JDBC(Java Data Base Connectivity:java数据库连接):它定义了一组标准的操作数据库的接口,既然是接口,那它就是一种规范,是Java操作数据库的技术规范. Java数据 ...

最新文章

  1. [转载]Word直接发布新浪博客(以Word 2013为例)
  2. const与readonly,析构函数,虚拟方法
  3. python定义一个类描述数字时钟_python自定义时钟类、定时任务类
  4. 聊一聊双十一背后的技术 - 不一样的秒杀技术, 裸秒
  5. Viola-Jones人脸检测详解
  6. centos下安装pip时失败:
  7. mysql创建表的时候日期给个默认值_mysql 创建表时 日期字段默认值为当前时间...
  8. Mysql-GTID
  9. 基于FPGA实现uart串口模块(Verilog)--------接收模块及思路总结
  10. Atitit 安全登录退出管理法v3 tbb.docx 目录 1.1. 未持有效出入边界票据。。校验票据有效性 1 1.2. 从事与票据种类不符的活动的 2 1.3. 数据为数字的应该校验数字 2
  11. 高级编程语言学习概论
  12. vc设备工程师_工程/设备工程师简历工作经历填写样本
  13. openwrt编译smartdns_【萌新理解交流】浅谈openWRT中的smartDNS中各个选项如何设置及其含义。...
  14. 常见查找算法--(快速查找或二分查找)
  15. 国内访问英文版维基百科地址
  16. 第一章、Android基础入门 - Android移动开发基础笔记
  17. Problem fzu 2027 单词问题
  18. **xxchat系统之线程池实时监控方案(Jmx远程后台监控、暂停、启用)
  19. 【电泳仪品牌】生科必知的电泳仪品牌
  20. 集成 12 种协议、可于USBC端口的快充协议芯片IP2188

热门文章

  1. Python复习笔记——编程篇
  2. C#ObjectArx Cad获取模型空间得所有实体
  3. 在局域网中安装和设置防病毒服务器(8)(转)
  4. Collections 工具类
  5. 页面多个检索条件下 开发技巧
  6. 伯俊ERP和金蝶云星空单据接口对接
  7. 最受程序员欢迎的公司榜单发布
  8. MySQL备份的持续验证:还原备份
  9. EIGRP学习笔记+重分发
  10. pb 两个程序之间传递数据方案_老板拖欠工资,程序员怒将项目开源,竟火爆GitHub!...