一 捕获异常try…catch…finally

捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理

捕获异常格式:

try {

  //需要被检测的语句。

}

catch(异常类 变量) { //参数。

  //异常的处理语句。

}

finally {

  //一定会被执行的语句。

}

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

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

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。

而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

  1. class ExceptionDemo{
  2. public static void main(String[] args){ //throws ArrayIndexOutOfBoundsException
  3. try {
  4. int[] arr = new int[3];
  5. System.out.println( arr[5] );// 会抛出ArrayIndexOutOfBoundsException
  6. 当产生异常时,必须有处理方式。要么捕获,要么声明。
  7. }
  8. catch (ArrayIndexOutOfBoundsException e) { //括号中需要定义什么呢?try中抛出的是什么异常,在括号中就定义什么异常类型。
  9. System.out.println("异常发生了");
  10. } finally {
  11. arr = null; //把数组指向null,通过垃圾回收器,进行内存垃圾的清除
  12. }
  13. System.out.println("程序运行结果");
  14. }
  15. }

二 try…catch…finally异常处理的组合方式

  try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。

  try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。

  1. void show(){ //不用throws
  2. try{
  3. throw new Exception();//产生异常,直接捕获处理
  4. }catch(Exception e){
  5. //处理方式
  6. }
  7. }

一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。

void show(){ //不用throws

try{

  throw new Exception();//产生异常,直接捕获处理

}catch(XxxException e){

  //处理方式

}catch(YyyException e){

  //处理方式

}catch(ZzzException e){

  //处理方式

  }

}

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子

类异常要求在上面的catch处理,父类异常在下面的catch处理。

  try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理

的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

  1. void show(){//需要throws
  2. try{
  3. throw new Exception();
  4. }finally {
  5. //释放资源
  6. }
  7. }

三 运行时期异常

  RuntimeException和他的所有子类异常,都属于运行时期异常。NullPointerException,ArrayIndexOutOfBoundsException

等都属于运行时期异常.

运行时期异常的特点:

  方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常

  运行时期异常一旦发生,需要程序人员修改源代码.

  1. class ExceptionDemo{
  2. public static void main(String[] args){
  3. method();
  4. }
  5. public static void method(){
  6. throw new RuntimeException();
  7. }
  8. }

四 异常在方法重写中细节

  子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。

  1. class Fu {
  2. public void method () throws RuntimeException {
  3. }
  4. }
  5. class Zi extends Fu {
  6. public void method() throws RuntimeException { } //抛出父类一样的异常
  7. //public void method() throws NullPointerException{ } //抛出父类子异常
  8. }

  当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。

  1. class Fu {
  2. public void method () throws NullPointerException, ClassCastException{
  3. }
  4. }
  5. class Zi extends Fu {
  6. public void method()throws NullPointerException, ClassCastException { } public void method() throws NullPointerException{ } //抛出父类异常中的一部分
  7. public void method() throws ClassCastException { } //抛出父类异常中的一部分
  8. }

  当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。

  1. class Fu {
  2. public void method (){
  3. }
  4. }
  5. class Zi extends Fu {
  6. public void method() throws Exception { }//错误的方式
  7. }
  1. interface Inter {
  2. public abstract void method();
  3. }
  4. class Zi implements Inter {
  5. public void method(){ //无法声明 throws Exception
  6. int[] arr = null;
  7. if (arr == null) {
  8. //只能捕获处理
  9. try{
  10. throw new Exception(“哥们,你定义的数组arr是空的!”);
  11. } catch(Exception e){
  12. System.out.println(“父方法中没有异常抛出,子类中不能抛出Exception异常”);
  13. //我们把异常对象e,采用RuntimeException异常方式抛出
  14. throw new RuntimeException(e);
  15. }
  16. }
  17. }
  18. }

五 异常中常用方法

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

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

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

  1. try {
  2. Person p= null;
  3. if (p==null) {
  4. throw new NullPointerException(“出现空指针异常了,请检查对象是否为null”);
  5. }
  6. } catch (NullPointerException e) {
  7. String message = e.getMesage();
  8. System.out.println(message );
  9.  
  10. String result = e.toString();
  11. System.out.println(result);
  12.  
  13. e.printStackTrace();
  14. }

六 自定义异常

  java中所有的异常类,都是继承Throwable,或者继承Throwable的子类。这样该异常才可以被throw抛出。

说明这个异常体系具备一个特有的特性:可抛性:即可以被throw关键字操作。

  并且查阅异常子类源码,发现每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮我们进行异常信息的封装。

例如NullPointerException异常类源代码:

  1. public class NullPointerException extends RuntimeException {
  2. public NullPointerException() {
  3. super();//调用父类构造方法
  4. }
  5. public NullPointerException(String s) {
  6. super(s);//调用父类具有异常信息的构造方法
  7. }
  8. }

自定义异常格式:

Class 异常名 extends Exception{ //或继承RuntimeException

public 异常名(){

}

  public 异常名(String s){

  super(s);

  }

}

自定义异常继承Exception演示

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

自定义异常继承RuntimeException演示

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

java 异常二的更多相关文章

  1. Java异常(二) 《Effective Java》中关于异常处理的几条建议

    概要 本章是从<Effective Java>摘录整理出来的关于异常处理的几条建议.内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误 ...

  2. Java异常(三) 《Java Puzzles》中关于异常的几个谜题

    概要 本章介绍<Java Puzzles>中关于异常的几个谜题.这一章都是以代码为例,相比上一章看起来更有意思.内容包括:谜题1: 优柔寡断谜题2: 极端不可思议谜题3: 不受欢迎的宾客谜 ...

  3. Java异常系列

    Java异常(一) Java异常简介及其架构 Java异常(二) <Effective Java>中关于异常处理的几条建议 Java异常(三) <Java Puzzles>中关 ...

  4. java提高篇(十七)-----异常(二)

          承接上篇博文:java提高篇-----异常(一) 五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表 ...

  5. “全栈2019”Java异常第二十二章:try-with-resources语句详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. “全栈2019”Java异常第十二章:catch与异常匹配

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. 浅谈java异常[Exception]

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

  8. 黑马----JAVA异常

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

  9. [Java面试二]Java基础知识精华部分.

    一:java概述(快速浏览): 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名 ...

随机推荐

  1. Go的100天之旅-01初识Go

    初识Go Go简介 Go的历史 上个世纪70年代Ken Thompson和Dennis M. Ritchie合作发明了UNIX操作系统同时Dennis M. Ritchie发明了C语言. 2007年的 ...

  2. Python Ethical Hacking - MAC Address & How to Change(3)

    SIMPLE ALGORITHM Goal  -> Check if MAC address was changed. Steps: 1. Execute and read ifconfig. ...

  3. xss利用

    xss盗取cookie 什么是cookie cookie是曲奇饼,啊开个玩笑,cookie是每个用户登录唯一id和账号密码一样可以登录到网站,是的你没有听错cookie可以直接登录,至于服务器怎么设置 ...

  4. 题解 洛谷 P4695 【[PA2017]Banany】

    考虑用动态点分治来解决像本题这样带修的树上路径问题. 首先对原树进行点分治,建出点分树,在点分树每个节点上用动态开点线段树来维护以该节点为起点,到其点分树子树中每个节点的利润. 查询时只需在点分树上当 ...

  5. I 2 C、 SPI、 USB驱动架构

    根据图12.4, Linux倾向于将主机端的驱动与外设端的驱动分离, 而通过一个核心层将某种总线的协议进行抽象, 外设端的驱动调用核心层API间接过渡到对主机驱动传输函数的调用. 对于I 2 C. S ...

  6. three.js 对象绕任意轴旋转--模拟门转动

    说了几篇的数学方法,这篇放松一下,郭先生说说绕任意轴转动.说一说其中一种方法,也是比较容易理解的一种,它的原理就是将子对象放到一个盒子中,然后改变子对象相对于父对象的位置(因为子对象的原点默认还是在盒 ...

  7. 前端学习(六):body标签(四)

    进击のpython ***** 前端学习--body标签 关于前面的都是大部分的标签内容 但是就像衣服一样,除了要有,还要放到适当的位置 我们先来看看一下网页的布局: 就可以看出来,网页都是一块一块的 ...

  8. pandas之Seris和DataFrame

    pandas是一个强大的python工具包,提供了大量处理数据的函数和方法,用于处理数据和分析数据. 使用pandas之前需要先安装pandas包,并通过import pandas as pd导入. ...

  9. python数据处理书pdf版本|内附网盘链接直接提取|

    Python数据处理采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.Excel.XML.J ...

  10. Python for循环使用 else 语句

    Python for循环使用 else 语句: else:当 for 所有的语句代码块正常运行完,才会运行 else 语句. 示例: ''' for 迭代对象 in 序列: 代码块(一行语句或多行代码 ...