java基础——异常处理

来源:互联网 发布:禅道windows安装包 编辑:程序博客网 时间:2024/06/05 11:39

异 常:

异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的产生有产生的原因、有问题的名称、有问题的描述等多个属性信息存在。当出现多属性信息最方便的方式就是将这些信息进行封装。异常就是java按照面向对象的思想将问题进行对象封装。这样就方便于操作问题以及处理问题。

出现的问题有很多种,比如角标越界,空指针等都是。就对这些问题进行分类。而且这些问题都有共性内容比如:每一个问题都有名称,同时还有问题描述的信息,问题出现的位置,所以可以不断的向上抽取。形成了异常体系。 

--------java.lang.Throwable

Throwable:可抛出的。 

|--Error:错误,一般情况下,不编写针对性的代码进行处理,通常是jvm发生的,需要对程序进行修正。

|--Exception:异常,可以有针对性的处理方式

无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名才作为子类的后缀名

这个体系中的所有类和对象都具备一个独有的特点;就是可抛性

可抛性的体现:就是这个体系中的类和对象都可以被throws和throw两个关键字所操作。

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

class  ExceptionDemo{

        public static void main(String[] args) {

                // byte[] buf = new byte[1024*1024*700];//java.lang.OutOfMemoryError内存溢出错误

        }

}

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

在开发时,如果定义功能时,发现该功能会出现一些问题,应该将问题在定义功能时标示出来,这样调用者就可以在使用这个功能的时候,预先给出处理方式。

如何标示呢?通过throws关键字完成,格式:throws 异常类名,异常类名...

这样标示后,调用者,在使用该功能时,就必须要处理,否则编译失败。

处理方式有两种:1、捕捉;2、抛出。

对于捕捉:java有针对性的语句块进行处理。

try {

需要被检测的代码;

}

catch(异常类 变量名){

异常处理代码;

}

fianlly{

一定会执行的代码;

}

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

catch (Exception e) { //e用于接收try检测到的异常对象。

        System.out.println("message:"+e.getMessage());//获取的是异常的信息。

        System.out.println("toString:"+e.toString());//获取的是异常的名字+异常的信息。

        e.printStackTrace();//打印异常在堆栈中信息;异常名称+异常信息+异常的位置。

}

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

异常处理原则:功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。

特殊情况:try对应多个catch时,如果有父类的catch语句块,一定要放在下面。

throw 和throws关键字的区别:

throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。

throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。throws用在函数上。

通常情况:函数内容如果有throw,抛出异常对象,并没有进行处理,那么函数上一定要声明,否则编译失败。但是也有特殊情况。

异常分两种:

1:编译时被检查的异常,只要是Exception及其子类都是编译时被检测的异常。

2:运行时异常,其中Exception有一个特殊的子类RuntimeException,以及RuntimeException的子类是运行异常,也就说这个异常是编译时不被检查的异常。

编译时被检查的异常和运行时异常的区别:

编译被检查的异常在函数内被抛出,函数必须要声明,否编译失败。

声明的原因:是需要调用者对该异常进行处理。

运行时异常如果在函数内被抛出,在函数上不需要声明。

不声明的原因:不需要调用者处理,运行时异常发生,已经无法再让程序继续运行,所以,不让调用处理的,直接让程序停止,由调用者对代码进行修正。

定义异常处理时,什么时候定义try,什么时候定义throws呢?

功能内部如果出现异常,如果内部可以处理,就用try;

如果功能内部处理不了,就必须声明出来,让调用者处理。

自定义异常:当开发时,项目中出现了java中没有定义过的问题时,这时就需要我们按照java异常建立思想,将项目的中的特有问题也进行对象的封装。这个异常,称为自定义异常。

对于除法运算,0作为除数是不可以的。java中对这种问题用ArithmeticException类进行描述。对于这个功能,在我们项目中,除数除了不可以为0外,还不可以为负数。可是负数的部分java并没有针对描述。所以我们就需要自定义这个异常。

自定义异常的步骤:

1:定义一个子类继承Exception或RuntimeException,让该类具备可抛性。

2:通过throw 或者throws进行操作。

异常的转换思想:当出现的异常是调用者处理不了的,就需要将此异常转换为一个调用者可以处理的异常抛出。

try  catch  finally的几种结合方式:

3
try
finally 
1,2
try
catch 

try 

catch

finally

这种情况,如果出现异常,并不处理,但是资源一定关闭,所以try  finally集合只为关闭资源

记住:finally很有用,主要用户关闭资源。无论是否发生异常,资源都必须进行关闭。

System.exit(0); //退出jvm,只有这种情况finally不执行。

当异常出现后,在子父类进行覆盖时,有了一些新的特点:

1:当子类覆盖父类的方法时,如果父类的方法抛出了异常,那么子类的方法要么不抛出异常要么抛出父类异常或者该异常的子类,不能抛出其他异常。

2:如果父类抛出了多个异常,那么子类在覆盖时只能抛出父类的异常的子集。

注意:

如果父类或者接口中的方法没有抛出过异常,那么子类是不可以抛出异常的,如果子类的覆盖的方法中出现了异常,只能try不能throws。

如果这个异常子类无法处理,已经影响了子类方法的具体运算,这时可以在子类方法中,通过throw抛出RuntimeException异常或者其子类,这样,子类的方法上是不需要throws声明的。

常见异常:

1、脚标越界异常(IndexOutOfBoundsException)包括数组、字符串;

空指针异常(NullPointerException)

2、类型转换异常:ClassCastException

3、没有这个元素异常:NullPointerException

4、不支持操作异常;

异常要尽量避免,如果避免不了,需要预先给出处理方式。比如家庭备药,比如灭火器。

--------------------------------------------------------------------------------------------------------------------
异常类体系
所以在Java 语言中代表异常时,不再使用数字来代表各种异常的情况,而是使用一个专门的类来代表一种特定的异常情况,在系统中传递的异常情况就是该类的对象,所有代表异常的类组成的体系就是Java 语言中的异常类体系。
为了方便对于这些可传递对象的管理,Java API 中专门设计了java.lang.Throwable 类,只有该类子类的对象才可以在系统的异常传递体系中进行。该类的两个子类分别是:
①:Error 类
该类代表错误,指程序无法恢复的异常情况。对于所有错误类型以及其子类,都不要求程序进行处理。常见的Error 类例如内存溢出StackOverflowError 等。
②:Exception 类
该类代表异常,指程序有可能恢复的异常情况。该类就是整个Java 语言异常类体系中的父类。使用该类,可以代表所有异常的情况。
在Java API 中,声明了几百个Exception 的子类分别来代表各种各样的常见异常情况,这些类根据需要代表的情况位于不同的包中,这些类的类名均以Exception 作为类名的后缀。如果遇到的异常情况,Java API 中没有对应的异常类进行代表,也可以声明新的异常类来代表特定的情况。
在这些异常类中,根据是否是程序自身导致的异常,将所有的异常类分为两种:
③:RuntimeException 及其所有子类
该类异常属于程序运行时异常,也就是由于程序自身的问题导致产生的异常,例如数组下标越界异常ArrayIndexOutOfBoundsException 等。
该类异常在语法上不强制程序员必须处理,即使不处理这样的异常也不会出现语法错误。
④:其它Exception 子类
该类异常属于程序外部的问题引起的异常,也就是由于程序运行时某些外部问题导致产生的异常,例如文件不存在异常FileNotFoundException 等。
该类异常在语法上强制程序员必须进行处理,如果不进行处理则会出现语法错误。
熟悉异常类的分类,将有助于后续语法中的处理,也使得在使用异常类时可以选择恰当的异常类类型。
由于异常类的数量非常多,在实际使用时需要经常查阅异常类的文档,
图片
---------------------------------------------------------------------------------------------------------------------
异常处理语法细则:
为了方便程序员进行异常的处理,在Java 语言中创建了一套语法,这
些语法主要分为以下几个部分:
1、抛出异常
当程序运行时,如果发现异常的情况,通过生成对应的异常对象,并将该异常对象传递给Java 的运行时系统,使得系统中包含该异常信息,这样的过程被称作抛出异常。
抛出异常是整个异常处理机制的起点,也是异常的发源地,一般出现在项目底层的代码中。
2、声明异常
当一个方法在执行时,除了能够完成正常的功能以外,还可以出现一些异常情况,为了提醒调用该方法的程序员注意处理这些异常情况,需要在方法的声明中将这些异常声明出来,这就是声明异常。
声明异常的语法使得异常处理更加容易进行实现。
3、捕获异常及异常处理
当异常被抛出以后,如果不进行处理,则异常会在方法调用过程中一直进行传递,直到最后一个方法,在J2SE 中也就是main 方法,最终将显示在控制台。
在实际项目中,当异常被抛出以后,需要首先捕获到该异常,按照异常的种类不同,分别进行处理。
4、声明自定义异常类
虽然在JDK API 中提供了几百个异常类,但是这些异常所代表的还只是常见的异常情况,在实际使用时还是无法代表所有的异常情况,所以Java 语言运行声明自定义的异常类,使用这些自定义的异常类来代表实际项目中JDK API 无法代表的异常情况。
下面依次详细介绍一下这些语法的相关规则。
抛出异常
在书写项目中相关的底层基础代码时,相关的方法除了实现应该实现的功能以外,还需要考虑到各种异常情况,如果出现该代码所在的方法无法处理的异常情况时,则应该在该方法内部抛出对应类型的异常时,使得整个方法的逻辑比较严谨。
例如,下面是一个实现将十进制数字转换为二进制或8 进制字符串的方法:
/**
* 将自然数转换为二进制或八进制字符串
* @param value 需要转换的自然数
* @param radix 基数,只能取2 或8
* @return 转换后的字符串
*/
public static String toString(int value,int radix){
        if(value == 0){
                return "0";
        }
        StringBuffer s = new StringBuffer();
        int temp; //余数
        while(value != 0){ //未转换结束
                temp = value % radix; //取余数
                s.insert(0,temp); //添加到字符串缓冲区
                value /= radix; //去掉余数
        }
        return s.toString();
}

在该方法中使用除n 取余的方法,将参数value 转换为对应的字符串,当在main方法中以书写如下代码时:
System.out.println(toString(12,2));
则程序的运行结果是:1100
这样在正常的情况下,程序获得了正确的结果,但是该方法由于逻辑的限制,只能实现将“自然数”转换为“二进制或八进制”字符串,如果在其它程序员误传入非法的参数时,则程序会获得不正常的结果,例如书写如下调用的代码时:
System.out.println(toString(12,16));
则程序的运行结果是: 12
这个结果在转换的逻辑上就是错误的。这样就因为其它程序员误传入非法参数而出现了错误的结果。如果该方法作为实际项目的一个逻辑存在,则会由于该方法的问题导致后续其它的功能也发生错误,这是每个程序员都不希望看到的。
所以该方法虽然在功能上达到了要求,但是逻辑还是不严谨的,还需要在其它程序员调用该方法时传入非法参数这样的异常情况时,将这种异常报告出来,这就需要抛出异常的的代码了。
抛出异常的语法格式为:
throw 异常对象;
例如:
throw new NullPointerException();

IllegalArgumentException e = new IllegalArgumentException();
throw e;
该代码书写在方法或构造方法的内部。该语法中,使用throw 关键字,后续为代表对应异常情况的异常类类型的对象。当系统执行到该代码时,将中止当前方法的执行,而直接返回到调用该方法的位置。所以在该代码下面不能直接书写其它的代码,因为这些代码将永远无法执行到。例如:
throw new NullPointerException();
int n = 10; //语法错误,该代码无法到达
按照该语法,则上面的转换方法改造以后的代码如下:
/**
* 将自然数转换为二进制或八进制字符串
* @param value 需要转换的自然数
* @param radix 基数,只能取2 或8
* @return 转换后的字符串
*/
public static String toString(int value,int radix){
//判断异常的代码
        if(value <0){
                throw new IllegalArgumentException("需要转换的数字不是自然数!");
        }
        if(radix != 2 && radix != 8){
                throw new IllegalArgumentException("进制参数非法");
        }
        if(value == 0){
                return "0";
        }
        StringBuffer s = new StringBuffer();
        int temp; //余数
        while(value != 0){ //未转换
结束
                temp = value % radix; //取余数
                s.insert(0,temp); //添加到字符串缓冲区
                value /= radix; //去掉余数
        }
        return s.toString();
}
这里,当value 的值小于0 时,则抛出非法参数异常,当radix 的值不是2 或8时,则抛出非法参数异常。
这样在执行如下代码:
System.out.println(toString(12,2));
System.out.println(toString(12,16));
则程序的执行结果是: 1100
Exception in thread "main" java.lang.IllegalArgumentException: 进制参数非法
at ThrowException.toString(ThrowException.java:22)
at ThrowException.main(ThrowException.java:7)
这里当参数符合要求时,则输出正确结果1100,如果参数不合法,则抛出异常,由于异常没有得到处理,则将终止程序的执行,则控制台输出异常的信息,并显示异常的类型以及异常出现的位置。
这样,就通过抛出异常的语法,使得该方法的逻辑比较严谨,在方法的参数不合法,即出现异常情况时,将这个异常报告出来,使得该方法不会出现错误的结果。
另外,抛出的异常将传递给运行时系统,这样就将这种异常的情况传递出来,提醒其它的结构进行处理。
---------------------------------------------------------------------------------------------------------------------
异常声明语法细则:
异常虽然被抛出了,但是由于抛出异常的代码是在方法或构造方法的内部的,在调用方法或构造方法时一般是无法看到方法或构造方法的源代码的,这样调用的程序员就无法知道该方法或构造方法将出现怎样的异常情况,所以需要有一种语法,可以使得调用的程序员可以看到被调用的结构可能出现的异常情况,这就是声明异常的语法。
声明异常的语法类似于药品上的副作用说明,在患者服用药品时,知道药品的正常功能,但是无法详细了解药品的成分以及每种成分的含量(类似于源代码),但是在药品的说明上都有副作用的说明,例如过敏者不能服用等,这些和声明异常的语法在功能上是类似。
声明异常的语法格式为:
throws 异常类名
例如:
public static void test(int n) throws IllegalArgumentException,IOException
public Test()throws IllegalArgumentException

该语法使用在方法和构造方法的声明以后,在throws 关键字以后,书写该方法或构造方法可能出现的异常,在这里需要书写异常类的类名,如果有多个,则使用逗号分隔这些异常类名即可。
这里需要注意的是:
1、这些异常必须是该方法内部可能抛出的异常
2、异常类名之间没有顺序
3、属于RuntimeException 子类的异常可以不书写在throws 语句以后,但是另外一类异常如果可能抛出则必须声明在throws 语句之后
通过在对应的方法或构造方法声明中书写throws 语句,使得调用该方法或构造方法的程序员可以在调用时看到对应结构可能出现的异常情况,从而提示对于这些异常情况进行处理,从而增强程序的健壮性。
而且即使在程序由于未处理对应的异常而导致程序在运行时出现错误时,也可以使程序员可以通过对应的提示获得错误的原因,并指导程序员进行逻辑的修正,这样都可以提高程序编写时的效率,也可以使程序员更加容易的编写出逻辑严谨的代码,从而增加项目的质量,提高程序的稳定性。但是声明异常以后,异常还是存在的,异常还没有获得处理,在异常体系中最重要的还是捕获到异常,然后针对异常的类型不同作出对应的处理。
--------------------------------------------------------------------------------------------------------------------
捕获异常及异常处理:
在整个异常处理机制中,异常在系统中进行传递,传递到程序员认为合适的位置,就捕获到该异常,然后进行逻辑处理,使得项目不会因为出现异常而崩溃。
为了捕获异常并对异常进行处理,使用的捕获异常以及处理的语法格式为:
    try{
        //逻辑代码
    }catch(异常类名参数名){
        //处理代码
    }
在该语法中,将正常的程序逻辑代码书写在try 语句块内部进行执行,这些代码为可能抛出异常的代码,而catch 语句中书写对应的异常类的类名,在catch语句块内部书写出现该类型的异常时的处理代码。程序执行到try-catch 语句时,如果没有发生异常,则完整执行try 语句块内部的所有代码,而catch 语句块内部的代码不会执行,如果在执行时发生异常,则从发生异常的代码开始,后续的try 语句块代码不会执行,而跳转到该类型的异常对应的catch 语句块中。
示例代码如下:
String s = "123";
try{
        int n = Integer.parseInt(s);
        System.out.println(n);
}catch(NumberFormatException e){
        System.out.println("该字符串无法转换!");
}
在该示例代码中, Integer 类的parseInt 方法可能会抛出NumberFormatException,因为parseInt 方法的声明如下:
public static int parseInt(String s) throws NumberFormatException
这里字符串s 转换为int没有发生异常,则程序执行完try 语句块内部的代码,程序的运行结果为:123
如果将字符串对象s 的值修改为”abc”,则运行上面的代码,则parseInt 方法执行时将抛出NumberFormatException,则调用parseInt 方法语句后续的try 语句块中的代码不会执行,程序的执行流程跳转到捕获NumberFormatException 异常的catch 语句块内部,然后执行该catch 语句块内部的代码,则程序的执行结果是:
该字符串无法转换!
这就是最基本的捕获异常和异常处理的代码结构。使用try 语句捕获程序执行时抛出的异常,使用catch 语句块匹配抛出的异常类型,在catch 语句块内部书写异常处理的代码。
在实际程序中,也可以根据异常类型的不同进行不同的处理,这样就需要多个catch 语句块,其结构如下:
try{
    //逻辑代码
} catch(异常类名1 参数名1){
    //处理代码1
} catch(异常类名2 参数名2){
    //处理代码2
}
……
}catch(异常类名n 参数名n){
    //处理代码n
}
例如:
String s = "123";
try{
        int n = Integer.parseInt(s);
        System.out.println(n);
        char c = s.charAt(4);
        System.out.println(c);
}catch(NumberFormatException e){
        System.out.println("该字符串无法转换!");
}catch(StringIndexOutOfBoundsException e){
        System.out.println("字符串索引值越界");
}
在执行时,按照catch 语句块书写的顺序从上向下进行匹配,直到匹配到合适的异常就结束try-catch 语句块的执行。
在实际执行时,就可以根据捕获的异常类型不同,书写不同的异常处理的代码了。使用该语法时需要注意,如果这些异常类直接存在继承关系,则子类应该书写在上面,父类应该书写在下面,否则将出现语法错误。例如:
String s = "123";
try{
        int n = Integer.parseInt(s);
        System.out.println(n);
        char c = s.charAt(4);
        System.out.println(c);
}catch(Exception e){
}catch(NumberFormatException e){ //语法错误,异常已经被处理
        System.out.println("该字符串无法转换!");
}catch(StringIndexOutOfBoundsException e){ //语法错误,异常已经被处理
        System.out.println("字符串索引值越界");
}
这里Exception 类是所有异常类的父类,在匹配时可以匹配到所有的异常,所有后续的两个异常处理的代码根本不会得到执行,所以将出现语法错误。正确的代码应该为:
String s = "123";
try{
        int n = Integer.parseInt(s);
        System.out.println(n);
        char c = s.charAt(4);
        System.out.println(c);
}catch(NumberFormatException e){
        System.out.println("该字符串无法转换!");
}catch(StringIndexOutOfBoundsException e){
        System.out.println("字符串索引值越界");
}catch(Exception e){
}
如果在程序执行时,所有的异常处理的代码都是一样的,则可以使用Exception 代表所有的异常,而不需要一一进行区分,
示例代码如下:
String s = "123";
try{
    int n = Integer.parseInt(s);
    System.out.println(n);
    char c = s.charAt(4);
    System.out.println(c);
}catch(Exception e){
    //统一的处理代码
}
在实际使用时,由于try-catch 的执行流程,使得无论是try 语句块还是catch语句块都不一定会被完全执行,而有些处理代码则必须得到执行,例如文件的关闭和网络连接的关闭等,这样如何在try 语句块和catch 语句块中都书写则显得重复,而且容易出现问题,这样在异常处理的语法中专门设计了finally 语句块来进行代码的书写。语法保证finally 语句块内部的代码肯定获得执行,即使在try
或catch 语句块中包含return 语句也会获得执行,语法格式如下:
finally{
    //清理代码
}
该语法可以和上面的两种try-catch语句块匹配,也可以和try 语句匹配使用,和try 语句块匹配的语法格式如下:
try{
    //逻辑代码
}finally{
    //清理代码
}
这样在执行时,无论try 语句块中的语句是否发生异常,finally 语句块内部的代码都会获得执行。而只书写finally 而不书写catch 则会导致异常的丢失,所以最常用的异常处理的语法格式还是如下语法:
try{
    //逻辑代码
}catch(异常类名参数){
    //异常处理代码
}finally{
    //清理代码
}
这样就是整个异常处理部分的逻辑代码、异常处理代码和清理的代码成为一个整体,使得程序代码更加显得紧凑,便于代码的阅读和使用。最后,介绍一下使用异常处理语法时需要注意的问题:
①:书写在try 语句块内部的代码执行效率比较低。所以在书写代码时,只把可能出现异常的代码书写在try 语句块内部。
②:如果逻辑代码中抛出的异常属于RuntimeException 的子类,则不强制书写在try 语句块的内部,如果抛出的异常属于非RuntimeException 的子类,则必须进行处理,其中书写在try 语句块是一种常见的处理方式。
③:catch语句块中只能捕获try 语句块中可能抛出的异常,否则将出现语法错误。
--------------------------------------------------------------------------------------------------------------------- 

声明自定义异常类
如果JDK API 中提供的已有的异常类无法满足实际的使用需要,则可以根据需要声明自定义的异常类来代表项目中指定类型的异常。
异常类在语法上要求必须直接或间接继承Exception,可以根据需要选择继承Exception 或RuntimeException 类,这样也设定了自定义异常类的类型。如果直接继承Exception,则属于必须被处理的异常,如果继承RuntimeException,则不强制必须被处理。当然,可以根据需要继承其它Exception 的子类。在编码规范上,一般将异常类的类名命名为XXXException,其中XXX 用来代表该异常的作用。
示例代码如下:
/**
* 自定义异常类
*/
public class MyException extends RuntimeException {}
自定义异常类的用途,则完全由程序员进行规定,可以在出现该异常类型的条件时抛出该异常,则就可以代表该类型的异常了。
在实际的项目中,有些时候还需要设计专门的异常类体系,来代表各种项目中需要代表的异常情况。
---------------------------------------------------------------------------------------------------------------------
异常的处理方式:
前面介绍了异常处理机制的相关语法,但是当出现异常时,如何进行处理是语法无法解决的问题,下面就介绍一下异常处理的方式。
异常处理,顾名思义就是将出现的异常处理掉,但是根据异常出现的位置以及异常的类型不同,会出现很多的方式,
依次介绍如下:
①:不处理
该处理方式就是只捕获异常不进行处理。不推荐使用该方式。
例如:
String s = “abc”;
try{
    int n = Integer.parseInt(s);
}catch(Exception e){
}

对于这样的处理,该异常被忽略掉了,有可能会影响后续逻辑的执行执行。该种处理方式一般被初学者使用的比较多。
②:直接处理掉
如果具备处理异常的条件,则可以根据不同的异常情况将该异常处理掉,例如给出用户错误原因的提示等或根据逻辑上的需要修正对应的数值。
例如:
/**
* 异常处理示例
* 该程序的功能是将用户输出的命令行参数转换为数字并输出
*/
public class ExceptionHandle1 {
        public static void main(String[] args) {
                int n = 0;
                try{
                        //将输入的第一个命令行参数转换为数字
                        n = Integer.parseInt(args[0]);
                        //输出转换后的结果
                        System.out.println(n);
                }catch(ArrayIndexOutOfBoundsException e){
                        System.out.println("请输入命令行参数!");
                }catch(NumberFormatException e){
                        System.out.println("命令行参数不是数字字符串!");
                }
        }
}

在执行该代码时,如果发生数组下标越界异常,则代表用户未输入命令行参数,则提示用户输入命令行参数,如果发生数字格式化异常,则代表用户输入的第一个命令行参数不是数字字符串,则给出用户对应的提示信息。
该示例中就是根据异常出现的原因提示用户进行正确的操作,这是一种常见的异常处理的方式。
③:重新抛出
在实际的项目,有些时候也需要将某个方法内部出现的所有异常都转换成项目中自定义的某个异常类,然后再重新抛出。
例如:
try{
    //逻辑代码
}catch(Exception e){
    throw new MyException();
}

这样转换以后,比较容易发现异常出现的位置,也方便项目中逻辑上的处理。
④:在方法中声明
如果当前方法或构造方法中,或在当前方法或构造方法中调用的其它方法,会抛出某个异常,而在当前方法或构造方法中没有足够的信息对该异常进行处理,则可以将该异常进行传递,将该异常传递给调用当前方法的位置在进行处理。这就是异常在系统中传递的方式。
例如:
/**
* 异常处理示例2
* 演示在方法中重新声明异常
*/
public class ExceptionHandle2 {
        public void test(String s) throws NumberFormatException{
                int n = Integer.parseInt(s);
                System.out.println(n);
        }
}
在test 方法中,由于parseInt 方法会抛出NumberFormatException 异常,而该方法内部无法对此进行处理,所以则在test方法内部声明把NumberFormatException异常抛出,这样该异常就由调用test 的方法再进行处理。这样异常就可以在方法之间进行传递了。
这里列举了异常处理中常见的一些处理方式,当然也可以根据需要,进行其它的处理。
--------------------------------------------------------------------------------------------------------------------
总结
异常处理是Java语言中增强程序健壮性的一种机制,Java语法为异常处理提供了一系列的语法格式,在实际的项目中,需要根据具体的情况对异常给出对应的处理,使得异常能够被正确的处理掉,从而保证项目的正常执行。