Java基础[八]:覆盖与异常
8、覆盖与异常
8.1 异常的基本概念
{
openTheFile;
determine its size;
allocate that much memory;
read-file;
closeTheFile;
}
8.1.1 什么是异常
- 异常是一种程序执行过程中非正常现象,包含逻辑错误、程序执行条件不满足等错误
- 为了加强程序的鲁棒性(强壮性,robust),程序设计时,必须考虑到可能发生的异常事件并做出相应的处理
- 在Java中,异常机制使得读、写和调试代码变得清晰,使得异常处理与程序主逻辑分开,有利于写出高鲁棒性代码。
8.1.2 JAVA中错误分类
- 语法错误:对于不符合Java语法的错误,在编译阶段,编译器会报错
- 运行错误:在程序运行时,程序发现其运行依赖的条件不满足,无法正常进行,如:数据库连接不上、文件不存在。解决办法,往往是修复依赖环境。部分运行错误可能是Java中Exception,部分可能是Error
- 逻辑错误:出现逻辑错误时,程序无法按照设计意图继续执行,如:nullpointexception,操作数组时indexoutofbound。如果出现逻辑错误,是程序代码有bug,需要代码修复
8.1.3 运行时异常例子

8.1.4 捕获运行时异常例子

8.1.5 Java异常的处理机制
- Java异常产生由throw语句产生
- Java自定义了一组异常和错误,在程序运行过程中,如果出现错误,由JDK中代码,throw语句产生
- 异常一旦产生,当前程序的正常执行被打断,如果方法没有处理异常,则方法结束返回至上一层方法调用
- Java程序在方法中通过 try catch块对可能产生异常的代码块进行封装处理
- 如果异常产生,而try catch块未捕获异常进行处理,则当前方法结束返回至上一层方法调用
- 如果异常至main函数仍未捕获,则程序退出
8.1.6 异常声明、抛出与捕获

8.1.7 异常传播方式

8.1.8 异常抛出




8.1.9 异常(Exception) VS 错误(Error)
- 错误由JVM抛出。用于描述系统内部错误,此类错误已经无法修复,一旦发生此类错误,程序只能通知终端用户,并且及时释放资源,优雅退出。例如内存不足等,合理的应用程序不应该试图捕获这类严重问题。
- 异常由程序抛出,一般情况下是有办法修复的,比如数据库连接不上,可能数据库宕机,修复方法为:重启数据库,程序周期性重新连接即可解决
8.2 异常继承结构
8.2.1 Java异常继承结构

8.2.2 系统错误

8.2.3 异常

8.2.4 运行时异常

8.2.5 创建自己的异常

class mydateException extends Exception{
private String reason;
public mydateException(String r){
reason=r;
}
public String getReason(){
return (reason);
}
}
class mydate{
int year,month,day;
void setdate(int y,int m,int d) throws mydateException{
if(d>31)
throw new mydateException("day too big");
year=y;
month=m;
day=d;
}
public static void main(String args[]){
mydate t=new mydate();
try{
t.setdate(2001,1,100);
}
catch(mydateException e){
System.out.println(e.getReason());
}
}
}
8.2.6 异常的声明
- 每个方法需要声明其可能抛出的checked 异常
- 方法可以声明其抛出某种异常(包含checked异常和运行时异常),但是可以永远都不抛出
- 如果调用了一个声明可能会抛出checked Exception的方法,编译器会强制要求调用方法对checked Excepton进行处理,如果不能处理,则自身也得声明抛出同样的checked Exception。
public void myMethod() throws IOException
8.3 异常的处理
程序处理异常有三种方法:
- 忽略异常
- 在其发生的地方进行处理
- 其他地方进行处理
初识捕获异常:
Java的异常机制的好处就在于它使我们在一个地方将精力集中在要解决的问题上,而在另一个地方处理来自那部分代码的异常情况。
try { // Code that may make exception
} catch ( Type1 id1 ) {
} catch ( Type2 id2 ) {
}
捕获所有的异常:
catch ( Exception e) {
System.out.println("caught an exception");
}
捕获所有的Error
catch ( Error e ){
System.out.println("caught an error");
}
捕获所有的错误和异常
catch ( Throwable e) {
System.out.println("caught an error");
}
Checked Exception的处理:

Finally语句;
- 在Try catch语句中,可以通过finally语句,声明必须要执行的代码
- 在finally块的代码在任何条件下都会执行
- 如果没有异常发生,finally的语句在try代码块执行完毕执行
- 如果有异常发生,finally语句在匹配上catch语句执行之后执行。
- 如果异常发生,但没有任何catch语句匹配,finally代码会直接执行
Finally详解:











当异常发生时,如果当前方法不知道该如何处理该异常,应该抛出。如果能够处理异常,则应该在当前方法进行处理。
何时使用try catch:
应该使用try catch语句处理意想不到的情况,而不应该处理能够处理并且简单的情况。
try {
System.out.println(refVar.toString());
}
catch (NullPointerException ex) {
System.out.println("refVar is null");
}
if (refVar != null)
System.out.println(refVar.toString());
else
System.out.println("refVar is null");
8.4 覆盖与异常








下一章节见https://blog.youkuaiyun.com/fageaaa/article/details/154516993
135

被折叠的 条评论
为什么被折叠?



