深入理解异常处理机制的处理方式

来源:互联网 发布:网络语鹅是什么意思 编辑:程序博客网 时间:2024/05/22 15:04
异常

上学(){

        设置标量;

        调用标量输出(标量值)
}
      标量输出(标量值){

if(堵车){

call 老师;

输出  堵车;

}else if(生病){

call 老师;

输出 生病;

}else{

输出 正常上课;
}
}

-------------------------------------------------------\\\

上学()

 可能存在 堵车,生病{


try {

输出 正常上课;

}catch(堵车){

 call  老师 堵车;

       }catch(生病){

call 老师 生病;
     }
}
-------------------------------------------------

异常:运行程序过程中不期而至的各种状况

异常是一个事件,它发生在程序运行期间。当干扰了程序正常运行。

Java通过API中Throwable类的子类描述各种不同的异常

Throwable:是java语言中所有的错误和异常的超类  (Errow和EXception)

Error : 错误,不能够通过程序写代码的技术手段来解决。指的的严重的系统错误

Exception:异常 在代码中,有可能发生,有可能不发生的错误现象

异常一般情况下,是在编译的时候没有问题,执行的时候出问题

Exception的重要子类:
RuntimeException 类以及子类表示 “JVM 常用操作” 引发的错误;

比如:对象的引用为空,除数为0  数组越界

通常,java的异常可以分为 可查的异常 和 不可查异常

可查异常/受检异常(编译器要求必须处理的异常):正确的程序在运行的过程中,很容易出现的,情理中可以接受的异常状况。可查异常虽然是异常状况,但是在一定程度上它的发生是可以预计的,而且一旦发生这种异常,就必须采取某种方式进行处理。

除了RuntimeException以及子类之外,其他的Exception类及其子类都属于可查异常。

可查异常的特点:Java编译器会检查这些异常。也就是说 当程序中可能出现这些异常,要么就try - catch捕获异常,要么使用throws子句来抛出异常。否则编译是不会通过

不可查异常/非受检异常/运行时异常(编译器不要求强制处置的异常)包括运行时异常(RuntimeExceptioin 及其子类)

可以不捕获 也可以不抛出
---------------------------------------------------------------------------
捕获异常

程序员必须要人工处理的异常

非捕获异常

程序员可以不人工处理的异常,交给JVM自动处理

-------------------------------------------------

两种处理方式:

抛出异常 当一个方法出现异常,方法需要创建异常对象并且交付给运行时系统,异常对象中包含了异常类型和异常出现的程序状态等信息,运行的时候系统辅助寻找处理异常的代码并执行

直白一些:自己不处理,进行抛出,抛出有自动抛出和手动抛出,手动抛出关键词throw 创建一个异常实例。


捕获异常 在方法抛出异常之后,运行的时候系统将转为寻找合适的异常处理器(exception handler)

直白一些:自己处理,不影响调用方法的处理机制
--------------------------------------

捕获异常

使用 try catch 

try 选定要捕获异常的范围 

如果在try中出现异常

则使用catch 捕获异常

格式:

try{

         代码段(可能出现异常代码)

}catch(异常类 ex){

对异常进行处理的代码段

}
------------------------------------------------

异常方法:

public void printStackTrace()

直接调用,可以打印异常的详细信

public String getMessage()

打印该方法的返回值,异常信息
-------------------------------------------------

多重catch

格式:

try{

代码段(可能出现异常代码)

}catch(异常类1 ex){

对异常进行处理的代码段

}catch(异常类2 ex){

对异常进行处理的代码段

}catch(异常类3 ex){

对异常进行处理的代码段

}catch(异常类4 ex){

对异常进行处理的代码段

}...

注意:如果前面的catch语句以及捕获异常,后面就不会捕获

     前面的catch异常范围小(子类),后面的catch异常范围大。(父类)
---------------------------------------------------------------------

写一个数组越界,并使用try catch捕获异常。

IndexOutOfBoundsException
-------------------------------------------------------

抛出异常 
throw  throws 关键词

抛出异常的情况:声明方法的时候,异常不在方法中进行处理,所以需要抛出,给调用方法的进行处理

如果一个方法没有捕获一个检查异常,name该方法必须使用throws关键词声明。

throws关键词放在方法签名的尾部。用来抛出异常的类型

throw 关键词方法在方法体中,用来抛出异常的对象

方法签名:方法名,参数列表

格式:

修饰符 返回值类型 方法名(参数列表) throws 异常类型{

throw 异常对象;
}
-----------------------------------------------------------------
自定义异常

四步操作

1.定义一个类继承Throwable或其子类,一般情况下都是继承Exception

2.添加构造方法(当然也可以不加)

3.在某个方法类抛出该异常

4.捕获该异常
-------------------------------------------------------------

定义一个自定义异常。

例:

1) 自定义两个异常类:非法姓名异常IllegaNameException和非法地址异常IllegalAddressException。

2) 定义Student类包含Name和Address属性,和setName、setAddress方法,当姓名长度小于1或者大于5时
抛出IllegaNameException,当地址中不含有“省”或者“市”关键字时抛出IllegalAddressException。
3) 编写程序抛出这两种异常,在main方法中进行捕获并合理地处理。

public class IllegaNameException extends Exception {

public IllegaNameException(String Message){
super(Message);

}
@Override
public void printStackTrace() {
// TODO Auto-generated method stub
super.printStackTrace();
}


}
public class IllegalAdressEXception extends Exception {
public IllegalAdressEXception(String Message){
super(Message);
}
@Override
public void printStackTrace() {
// TODO Auto-generated method stub
super.printStackTrace();
}
}
public class Student {
private String name;
private String adress;

public void setName(String name) throws  IllegaNameException {
if((name.length()<2)||(name.length()>5)){
throw new  IllegaNameException("姓名不规范");
}
this.name = name;
}
public void setAdress(String adress) throws IllegalAdressEXception {
int x=adress.indexOf("省");
int y=adress.indexOf("市");
if((x==-1)&&(y==-1)){
throw new IllegalAdressEXception("地址名不规范");
}
this.adress = adress;
}
}
public class TestStudent {
public static void main(String[] args) {
Student s=new Student();
try {
s.setName("张");
} catch ( IllegaNameException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
s.setAdress("成都");
} catch (IllegalAdressEXception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
-------------------------------------------------------------------

finally 关键词

格式:

try{

代码1

}[catch(异常 ){

代码2

}]finally{

代码3
}

说明:[] 中的内容可以有可无

代码1 可能执行一段 

代码2 可能会执行

代码3 必须执行

----------------------------------------------------------

final

finally

  用来创建在try代码块后面必须执行的代码块

 无论是否发生异常,finally代码块中的代码总会被执行

在finally代码块中,可以运行清理类型等收尾善后语句  比如 关闭资源,关闭连接

-----------------------------------

注意:

catch不能独立于try而存在

在try、catch语句后面天津finally 并不是强制性的

try代码后不能既没有catch也没有finally

-------------------------------------------------------