1.异常的概念

异常:程序在运行时出现的不正常情况,也可以说是出现的问题;
Java中的异常:出现的不正常的问题也是一类事物,这类事物有一些共性的东西,比如有名称,有产生的原因等,将这些共性的部分抽取后,可以通过Java类的形式对其进行描述,并封装成对象;
简单的说就是,Java对不正常情况进行描述后的对象体现;

2.Java中的异常体系

|--Throwable:Java中的所有异常都有Throwable继承而来;
|--Error:描述的是Java运行时系统的内部错误和资源耗尽错误;是一类严重的问题;
|--Exception:非严重的问题;
|--RuntimeException:由于程序错误导致的异常;尽量不处理,暴露出来;
|--其他非RuntimeException:程序本身没有问题,而是有其他比如IO错误导致的异常;
“如果出现RuntimeException异常,那么就一定是你的问题;”
异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性;可以被throw(对象)和throws(类)所操作;

对于Exception:

(1).编译时被检测异常:非RuntimeException

       该异常在编译时,如果没有处理(没有声明也没有捕获),在编译时会失败;
(2).编译时不检测异常:RuntimeException及其子类
       该异常在编译时,不检测是否处理了该异常;

针对此类异常当出现问题时,希望异常暴露出来,不需要调用者对其进行处理,让程序停止,然后修正程序;

3.声明异常

声明异常也可以理解为抛出异常;
方法应该在其首部声明(throws抛出异常类)所有可能抛出的异常,这样可以从首部反映出这个方法可能抛出的异常,提高了安全性,如果没有处理在编译时期就会提示错误信息;
void function() throws XxxException     //在方法首部声明异常,调用者必须进行处理(抛或者捕获);
{
可能会出现异常的代码;
throw new XxxException(message); //在方法内部抛出异常对象;
}
throw和throws关键字:
(1).throw定义在方法内部,用于抛出异常对象;
(2).throws定义在方法首部,用于抛出异常类,同时可以抛出多个异常类,异常类之间用逗号隔开;
如果在方法内部抛出了RuntimeException的异常对象,在方法上可以不声明该异常;
如果方法上声明了RuntimeException异常,可以不对其进行捕获;
尽量不声明RuntimeException异常;

4.捕获异常

1
2
3
4
5
6
7
8
9
10
11
12
13
try
{
可能会抛出异常的代码块;
}
catch(ExceptionType  变量)
{
处理异常的代码;
}
......//可以针对多个异常设计多个catch块;
finally
{
一定会执行的代码:通常用于关闭资源;
}

对于finally子句的说明,在上述方式异常捕获的方式中,有三种可能执行finally的情况,分析如下:
(1).代码没有抛出异常,正常执行try代码块中的所有代码,然后执行finally代码块;
(2).抛出了一个在catch语句中进行捕获的异常,执行try代码块中的语句直至异常语句,然后跳过try代码块中的其他语句,执行异常匹配的catch代码块,最后执行finally代码块;

在catch代码块中,若没有抛异常,则finally结束后继续执行;

在catch代码块中,若抛出了一个异常,异常将被抛回这个方法的调用者;

(3).抛出了一个异常,但是不幸的是这个异常不是有catch语句捕获的,执行try代码块中的语句直至异常语句,然后跳过try代码块的其他语句,执行finally代码块,并将异常抛给这个方法的调用者;
(4).在finally代码块中也可能会抛出异常,也可以用try/catch处理;
(5).finally代码块有一种情况读不到,当catch代码块中出现系统退出语句时:System.exit(0);

其他说明:
(1).当我们对异常不进行catch处理或者抛处理时,最终处理异常的是JVM,JVM会将异常信息和堆栈跟踪信息打印在控制台上;
(2).在查看API文档后,发现异常类的构造方法中有默认的构造方法,还有带有自定义信息的有参构造方法;
(3).异常类中的常用的方法:
String getMessage():获取异常信息;
String toString():获取该异常的简单说明,包括异常名称和异常信息;
void printStackTrace():打印堆栈信息,异常出现的位置信息,这是JVM默认的异常处理机制;

(4).不要定义多余的catch来捕获异常,因为如果真的出现自己未定义的异常,希望其暴露出来;

(5).在声明异常时,建议声明更为具体的异常,这样处理起来就更加具体;

(6).声明了几个异常就定义几个catch块,当多个异常中出现了继承关系,父类异常对应的catch代码块放在多个catch代码块的最后;

(7).catch块中尽量定义具体的处理方式,将异常信息保存为异常日志文件;

5.异常处理的格式

(1).try{ } catch(XException e){ } finally{ }

(2).try{ } catch(XException e){ }

(3).try{ } finally{ }

其中catch可以是多个catch;而且在catch代码块和finally代码块中可以嵌套try/catch语句;

值得注意的是第三种格式,catch用于处理异常,如果没有catch,表示没有处理异常,对于非RuntimeException需要声明;

6.自定义异常

在实际程序设计中,可能会遇到Java提供的标准异常类没有能够充分的描述清楚当前设计中的问题,这时就需要按照Java封装问题对象的思想,对特有的异常进行自定义异常的封装;

(1).如何自定义异常类:

定义一个派生于Exception的类,或者派生于Exception子类的类;

如果希望该自定义异常具备RuntimeException的一些特性,可以继承RuntimeException类;

这样可以让该自定义异常具备可抛性,同时具备操作异常的一些共性方法;

(2).自定义异常类的初始化:

Throwable和Exception类中都定义了无参的默认构造方法以及带有描述信息的有参构造方法;

1
2
3
4
5
6
7
8
9
10
11
//自定义异常类;
class XxxException extends Exception    //也可以根据需要继承RuntimeException;
{
    //默认的构造方法;
    XxxException(){}
    //有参构造方法;
    XxxException(String message)
    {
        super(message);     //直接调用父类的构造方法;
    }
}

7.异常在子父类覆盖中的体现

(1).子类方法覆盖父类方法时,如果父类方法抛出了异常,那么子类的覆盖方法只能抛出父类方法所抛异常或是其子类异常,或者不抛异常;

(2).子类方法覆盖父类方法时,如果父类方法抛出多个异常,那么子类的覆盖方法只能抛出父类方法所抛异常的子集;

(3).如果父类或者接口中的方法没有抛出异常,那么子类在覆盖方法时,也不能抛出异常;但是如果子类方法确实可能发生异常,就必须进行try/catch处理,不能在方法上声明异常;

8.异常的转换

在catch子句中可以抛出一个异常,这样做的目的是改变异常的类型;
(1).如果捕获到的异常处理不了,但是并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相关的异常;
(2).捕获的异常能够处理,当需要将异常产生的和本功能相关的问题提供出去让调用者知道并处理,也可以将捕获的异常处理后,在转换为新的异常抛出;
1
2
3
4
5
6
7
8
9
try
{
throw new AException();//try代码块中可能出现的异常;
}
catch(AException e)   //catch进行捕获;
{
.......           //可以对之前捕获的异常作一定的处理;
throw new BException();//抛出另外异常;
}

9.异常的好处

(1).提高了安全性;

(2).按照面向对象的思想对问题进行封装,处理起来更加方便;

(3).将正常流程代码和异常处理代码以及必要的管理资源代码相分离,方便于阅读;

10.异常程序中的体现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
毕老师使用电脑上课;
问题:
电脑蓝屏;蓝屏后能处理,重启;
电脑挂了;挂了就不能处理了;
对问题进行描述,封装对象;
*/
  
package com.zr.day09;
  
class LanPingException extends Exception
{
    LanPingException(String message)//自定义的蓝屏异常
    {
        super(message);
    }
}
class GuaException extends Exception
{
    GuaException(String message)//自定义的死机异常
    {
        super(message);
    }
}
  
class NoContinueException extends Exception
{
    NoContinueException(String message)//自定义的课程无法继续异常
    {
        super(message);
    }
}
  
class Computer
{
    private int flag = 3;//标记:用来标识每一种情况
    public void run() throws LanPingException,GuaException
    {
        if(flag == 2)
            throw new LanPingException("电脑蓝屏了");
        if(flag == 3)
            throw new GuaException("电脑挂了");
        System.out.println("Com run");
    }
    public void reset()
    {
        flag = 1;
        System.out.println("Com reset");
    }
}
  
class Teacher
{
    private Computer com;
    private String name;
    Teacher(String name)
    {
        this.name = name;
        com = new Computer();
    }
    public void prelect() throws NoContinueException//抛出异常希望交给更上层的调用者处理
    {
        try {
            com.run();
        } catch (LanPingException e) { //处理蓝屏异常
            com.reset();
        } catch (GuaException e)//异常转换:转换为调用者实际能够处理的异常,然后抛给调用者;
        {
            //throw单独存在时后面不要接语句,有可能永远执行不到;
            throw new NoContinueException("上不了课啦----"+e.getMessage());
        }
        System.out.println("teaching !");
    }
}
  
class ExceptionDemo
{
    public static void main(String[] args)
    {
        Teacher t = new Teacher("Mr.Bi");
          
        try {
            t.prelect();
        } catch (NoContinueException e) {
            System.out.println(e.getMessage());
            System.out.println("大家自习");
        }
    }
}

Java基础之异常的更多相关文章

  1. java基础之异常 · fossi

    在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...

  2. 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  3. JAVA基础知识|异常

    一.基础知识 处理异常,java提供了一个优秀的解决方案:异常处理机制. java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Excep ...

  4. 【java基础之异常】死了都要try

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  5. Java基础笔记-异常

    Java中的异常机制: Throwable类是 Java 语言中所有错误或异常的超类.主要包括两个子类: Error和Exception. 一般中要处理的异常是Exception. Java中最常见的 ...

  6. 黑马程序员----java基础:异常

    dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...

  7. java基础(21):异常

    1. 异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 1.1 ...

  8. java基础之异常。

    异常: (1)异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描述后 ...

  9. 第一阶段:Java基础之异常和处理

    文章目录 Java中异常处理机制的简单和应用 一.异常的体系结构&分类 二.问题扩展 三.应用场景 Java中异常处理机制的简单和应用 异常也是一种对象,Java中有很多异常类,并且定义了基类 ...

随机推荐

  1. WEB相关知识和Tomcat服务器

    WEB相关知识 1.Internet上供外界访问的Web资源分为: 静态web资源:指web页面中供人们浏览的数据始终是不变的. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间 ...

  2. enode框架step by step之事件驱动架构(EDA)思想的在框架中如何体现

    enode框架step by step之事件驱动架构(EDA)思想的在框架中如何体现 上一篇文章,我给大家分享了我的一个基于DDD以及EDA架构的框架enode,但是只是介绍了一个大概.接下来我准备用 ...

  3. MacOSX64位机器上gcc编译32位x264静态库

    x264最新包地址:http://www.videolan.org/developers/x264.html 编译命令: ./configure --enable-static --host=i386 ...

  4. SharePoint 2013/2010 中的日历重合 (Calendars Overlay)

    本文介绍 SharePoint 2013/2010 中的日历重合 (Calendars Overlay). 日历重合 (Calendars Overlay)的用途就是将 不多于10个日历或日历视图聚集 ...

  5. iOS学习笔记(十六)——数据库操作(使用FMDB)

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  6. elike.python.function()

    将python用于基本的科学计算,能完全替代matlab.就最近写的一个物理模型程序来看,用python建立的物理模型的可控性,代码的层次性都优于matlab,只不过python没有matlab那样的 ...

  7. JQuery动态操作表格

    新人,小白一枚,刚刚参加工作,所以会在这里记录一些遇到的问题. 最近要做的东西,是对一个表格动态的添加行,删除行,并且对表格中内容进行非空验证. <!DOCTYPE html> <h ...

  8. 使用div模拟textarea,实现文本输入框高度自适应(附:js控制textarea实现文本输入框高度自适应)

    一.使用textarea标签进行多行文本的输入有很多限制,比如不能实现高度自适应,会出现难看的滚动条等问题. HTML5中添加了一个新属性contenteditable,该属性可以让input,tex ...

  9. 用备份控制文件做不完全恢复下的完全恢复(全备<老>--备份控制文件<次新>--删除表空间andy--日志文件<新>)

    为什么会使用备份的控制文件? 实际工作中主要有两种情况:第一种:当前控制文件全部损坏,而数据文件备份,控制文件备份及当前日志处于不同SCN版本,它们之间又增加过表空间(数据文件).第二种:当前控制文件 ...

  10. JQuery基础知识(1)

    JQuery基础知识(1) 对JQuery学习中遇到的小细节进行了整理和总结 1.JQuery hide()和show()方法,分别对选中的元素进行隐藏和显示,语法:hide()和show分别有对应的 ...