Java基础之异常
1.异常的概念
2.Java中的异常体系
|--Error:描述的是Java运行时系统的内部错误和资源耗尽错误;是一类严重的问题;|--Exception:非严重的问题;
|--RuntimeException:由于程序错误导致的异常;尽量不处理,暴露出来;|--其他非RuntimeException:程序本身没有问题,而是有其他比如IO错误导致的异常;“如果出现RuntimeException异常,那么就一定是你的问题;”
对于Exception:
(1).编译时被检测异常:非RuntimeException
该异常在编译时,如果没有处理(没有声明也没有捕获),在编译时会失败;(2).编译时不检测异常:RuntimeException及其子类该异常在编译时,不检测是否处理了该异常;针对此类异常当出现问题时,希望异常暴露出来,不需要调用者对其进行处理,让程序停止,然后修正程序;
3.声明异常
void function() throws XxxException //在方法首部声明异常,调用者必须进行处理(抛或者捕获);{
可能会出现异常的代码;throw new XxxException(message); //在方法内部抛出异常对象;
}
(1).throw定义在方法内部,用于抛出异常对象;(2).throws定义在方法首部,用于抛出异常类,同时可以抛出多个异常类,异常类之间用逗号隔开;
4.捕获异常
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
try{可能会抛出异常的代码块;}catch(ExceptionType 变量){处理异常的代码;}......//可以针对多个异常设计多个catch块;finally{一定会执行的代码:通常用于关闭资源;} |
在catch代码块中,若没有抛异常,则finally结束后继续执行;
在catch代码块中,若抛出了一个异常,异常将被抛回这个方法的调用者;
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.异常的转换
|
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基础之异常的更多相关文章
- java基础之异常 · fossi
在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...
- 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!
目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...
- JAVA基础知识|异常
一.基础知识 处理异常,java提供了一个优秀的解决方案:异常处理机制. java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Excep ...
- 【java基础之异常】死了都要try
目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...
- Java基础笔记-异常
Java中的异常机制: Throwable类是 Java 语言中所有错误或异常的超类.主要包括两个子类: Error和Exception. 一般中要处理的异常是Exception. Java中最常见的 ...
- 黑马程序员----java基础:异常
dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...
- java基础(21):异常
1. 异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 1.1 ...
- java基础之异常。
异常: (1)异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描述后 ...
- 第一阶段:Java基础之异常和处理
文章目录 Java中异常处理机制的简单和应用 一.异常的体系结构&分类 二.问题扩展 三.应用场景 Java中异常处理机制的简单和应用 异常也是一种对象,Java中有很多异常类,并且定义了基类 ...
随机推荐
- 竞价广告系统-ZooKeeper介绍
ZooKeeper介绍 为了讲述的完整性,介绍一下ZooKeeper.ZooKeeper在Index和Ad Server里使用比较多,虽然它可能没有google的Chubby好,但它是开源的工具.举一 ...
- Struts2.1.8 + Spring3.0+ Hibernate3.2整合笔记
body, p, th, td, li, ul, ol, h1, h2, h3, h4, h5, h6, pre { font-family: simsun; line-height: 1.4; } ...
- ASP.NET4.5Web API及非同步程序开发系列3
ASP.NET4.5Web API及非同步程序开发系列(3) 接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定 ...
- static类成员(变量和函数)
0. 使用背景 对于特定类类型的全体对象而言,访问一个全局对象有时是必要的.也许,在程序的任意点需要统计已创建的特定类类型对象的数量:或者,全局对象可能是指向类的错误处理例程的一个指针:或者,它是指向 ...
- 【deep learning学习笔记】最近读的几个ppt(四)
这几个ppt都是在微博上看到的,是百度的一个员工整理的. <Deep Belief Nets>,31页的一个ppt 1. 相关背景 还是在说deep learning好啦,如特征表示云云. ...
- 黑马程序员:Java基础总结----GUI图形化界面
黑马程序员:Java基础总结 GUI图形化界面 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! GUI(Graphical User Interface)图形化界 ...
- [置顶] 遵循Java EE标准体系的开源GIS服务平台架构
传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...
- Python学习入门基础教程(learning Python)--2.3.3Python函数型参详解
本节讨论Python下函数型参的预设值问题. Python在设计函数时,可以给型参预设缺省值,当用户调用函数时可以不输入实参.如果用户不想使用缺省预设值则需要给型参一一赋值,可以给某些型参赋值或不按型 ...
- 浅析flannel与docker结合的机制和原理
flannel flannel可以为容器提供网络服务. 其模型为全部的容器使用一个network,然后在每个host上从network中划分一个子网subnet. 为host上的容器创建网络时,从su ...
- TFS Services 集成Docker
随着Docker的爆发,越来越多软件研发团体开始享用和受益于Docker系统体系带来的巨大好处.Docker的使用,除了减少软硬件成本的立竿见影效果,更是对软件生命周期过程开发.测试.生成部署和运维整 ...