Java基础之异常处理

一、异常简介
1.异常的定义
运行期间出现的错误,而不是编译时的语法错误
例如
打开一个不存在的文件
网络连接中断
操作数组越界
eg:
public class excption_sample {
public static void main(String args[ ]){
int i = 0;
String greetings[ ] = {“Hello World”,
“Hello Dingdang”,
“Hello Kitty”};

   while(i<4){
      System.out.println(greetings[i]);
      i++;
   }
}

}

二、异常的分类
1.异常的体系结构

2.分类
检查性异常
若系统运行时可能产生该类异常,则必须写出相应的处理代码,否则无法通过编译
非RuntimeException异常
非检查性异常
若系统运行时可能产生该类异常,则不必在程序中声明对该类异常的处理,就可以编译执行
非RuntimeException:运行时异常
3.常见的异常及其分类
非检查性异常 说明
RuntimeException java.lang包中多数异常的基类
ArithmeticException 算术错误,如除以 0
IllegalArgumentException 方法收到非法参数
ArrayIndexOutOfBoundsException 数组下标出界
NullPointerException 试图访问 null 对象引用

三、异常的处理机制
1.异常处理过程

在Java程序中,执行过程中如果出现异常事件,系统会发出异常报告,这时系统将生成一个异常类对象,异常类对象封装了异常事件的信息并将其提交给Java运行时系统
Java中可用于处理异常的两种方式:
自行处理:可能引发异常的语句封入在try块内,而处理异常的相应语句则封入catch块内
回避异常:在方法声明中包含throws子句,通知潜在调用者,如果发生了异常,必须有调用者处理。
2.try… catch语句
public class excption_sample {
public static void main(String args[ ]){
int i = 0;
String greetings[ ] = {“Hello World”,
“Hello Dingdang”,
“Hello Kitty”};
try{
// try{}表示可能发生异常的语句
while(i<4){
System.out.println(greetings[i]);
i++;
}
//catch()内的参数异常类对象的声明
}catch(ArrayIndexOutOfBoundsException e){
//catch{}内的语句是对异常的处理
System.out.println(“数组越界异常”);
}
}
}

catch块,是用来捕获并处理try块抛出的异常的代码块。没有try块,catch块不能单独存在。我们可以有多个catch块,以捕获不同类型的异常
如果程序抛出多个不同类型的异常,我们需要多个catch()语句来处理
和特殊异常类相关联的catch()块必须写在和普通异常类相关联的catch()之前
try{… } 和 catch{… } 之间不可以添加代码

四、finally语句
finally语句放在try… catch语句后
finally语句中的代码块不管异常是否被捕获总是要执行

通常在finally语句中可以进行资源的清除操作, 如:关闭打开文件、删除临时文件
对应的finally代码中的语句,即使try代码块和catch代码块中使用了return语句退出当前方法或般若break跳出循环,相关的finally代码块都有执行
当try或catch代码块中执行了System.exit(0)时,finally代码块中的内容不被执行

eg:
catch (ArrayIndexOutOfBoundsException e) {
System.out.println(“Out of Bounds!”);
return;
}
catch (RuntimeException e) {
System.out.println(“Runtime Exception!”);}
catch (Exception e) {
System.out.println(“Exception!”); }
//无论是否捕获异常,系统都会执行该语句
finally{
System.out.println(“program is running into
finally!”);
}

五、throw关键字
如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则可以在程序所在的函数声明后,使用throw关键字抛出异常
class ThrowsDemo{
public void proc( ) throws IOException{
System.out.println(“inside proc”);
}
}

位置:函数参数列表的后面
throws关键字后面,可以跟多个异常,中间用逗号分隔
throws关键字抛出的异常,由调用该函数的函数处理

方法中如果使用throws关键字抛出:
非检查性异常:上一级去除异常,直到不抛出异常
检查性异常
在调用该函数内try-catch,把异常处理掉。那么不往上一级抛出异常,程序正常执行,上一级方法并不知道曾经产生异常
用throws声明方法抛出异常,不进行处理。谁调用谁负责处理
覆盖方法抛出异常时,可以抛出与呗覆盖方法相同的异常或者被覆盖方法异常的子类异常

六、throw语句
异常是通过关键字throw语句引发明确的异常
eg:
void doA() throws Exception1 {
try {
……
} catch(Exception1 e) {
throw e;
} catch(Exception2 e) {
System.out.println(“出错了”);
}

throw语句用在方法体内,表示抛出异常,由方法体的语句处理。不能单独使用,要么和try… catch… 一起使用。要么和throw一起使用
throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象

七、方法调用堆栈
后进先出

八、自定义异常类
如果Java提供的异常类型不能满足程序设计的需要,我们可以定义自己的异常类型
用户自定义的异常类应为Exception类的子类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值