您的位置:首页 > 编程语言 > Java开发

浅谈java异常的捕获及处理

2018-03-20 15:39 330 查看
            在程序的编译或者运行过程中都有可能出现各种错误,有语法错误,有语义错误,也有硬件问题。这些错误的出现有可能导致程序的停止,缓慢运行,对于java程序而言这些都称为异常,就是导致程序不能正常运行或者编译的各种因素。

一 异常的概念:
    异常是导致程序不能正常进行的一种因素,如果不能正确去处理异常就会干扰你的程序,所有我们在写代码时需要考虑异常的产生可能,或者对可能产生异常程序进行处理,在java中对于异常的处理其实也是遵从面向对象的思想,所谓万物皆对象,我们可以把具体的异常作为一个对象,我们也可以去自定义异常类。

 认识异常:
    public static void main(String[] args) {
int i = 1;
int j = 0;
System.out.println(i/j);//次数会有异常,因为被除数不能为0
System.out.println("ssss");

}从上面的实例刻制,如果某处代码发生了异常没有处理,那么程序就会停止无法继续执行
【小记】在计算机的发展中,有两大杀手,一是断电,二是无穷大,如果被除数是0代表结果是无穷大,一旦结果是无穷大内存就会被全部占满,程序无法运行。

Java异常的分类和类结构图



错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。
在程序中异常的处理:
public static void main(String[] args) {

try {
//有可能出现异常的语句
System.out.println("ssss");
} catch (Exception e) {//异常类和对象

//异常处理1
e.printStackTrace( );
}catch (RuntimeException e) {

//异常处理2
}catch (RuntimeException e) {

//异常处理3
}finally {
//此处的代码一定会执行
}

}


【提示】
    在catch语句中输出异常时,除了可以直接使用System.out.println("异常信息");这样异常信息外,大部分都会选择使用Exception类的printStackTrace()打印异常信息,这样的好处是打印出来的异常信息更加完整。

java异常的出咯机制:
        一旦有异常就实例化一个异常对象,然后再try中进行捕捉,



        在catch中对改异常对象进行类型匹配,因为产生的异常类型不一样,所有显示的结果也不一样



【注意】在实际的开发中,如果已经将Exception作为最大的异常去处理。如果在catch中还有Exception的子类去匹配那么就会出现异常



                    throws和throw关键词

    1:throws  

    在定义一个方法时可以使用throws关键词申明,表示此方法内部对此对象的异常不做处理,而是交给调用者处理。

    /**
* 普通方法处使用throws 表示此方法不处理异常
* @throws Ex
4000
ception
*/
public void df() throws Exception{
System.out.println("sss");

}
/**
* 主方法抛出异常,此时的异常是交给虚拟机处理,因为一个程序是从主方法开始运行
* @param args
* @throws Exception
*/
public static void main(String[] args)  throws Exception{

try {
//有可能出现异常的语句
System.out.println("异常信息");
throw new Exception();//实例化一个异常对象

二  throw  直接实例化一个异常对象,throw只负责产生一个异常对象,至于这个异常怎么处理,是抛出还是直接处理他是不干预的。




    

【注意】
    throw尽量不要单独使用,因为你产生了一个异常就必须要处理,要么自己处理,要么抛出。

        throw和throws的总合运用
class ExceptionTest {
public void s() throws Exception{ //如果有异常就抛出
System.out.println("1111111111");
int i = 0;
int j = 1;
try {
//此处会有异常
i = i/j;
System.out.println("22222222222");
} catch (Exception e) {
//实例异常
throw e;
}finally {
System.out.println("33333333");
}
}
}

class showe {

public void gg() {
ExceptionTest e = new ExceptionTest();
try {
//调用上面类中的方法,因为调用的方法有异常抛出,所有在调用时那么处理要么继续抛出
e.s();
} catch (Exception e1) {
//这里的异常类就是上面类throw出来的
System.out.println(e+"异常类");
}
}
【好好体会上面的例子】

 Exception和RuntimeException
   1: Exception在程序中必须try  catch

   :2:RuntimeException可以不try  因为如果有异常有JVM处理。



自定义异常
在实际的开发中,基本都会自定义异常,因为自定义异常可以满足我们需要的各个场合,并且可以按照我们的想法打印出相应的内容。

在自定义异常类时必须要继承Exception 类,在设计时我们还可以在自定义类的构造方法中定义一个枚举类,枚举类的作用是打印相应的内容。这里就用到了多太的思想,因为自定义的类都是xception的子类,所有该异常子类继承了Exception的所有的异常情况,



code       表示错误码  比如500  系统异常  404  找不到路径    等
erroMsg  表示具体的错误信息
EnumRespCode 表示一个枚举类,提供了各种需要的异常信息提示和错误码



实例:
class MyErroe extends Exception {
private String code;
private String mesg;

public MyErroe(String code , String mesg) {
super();
System.out.println("我的自定义异常");
}
}

class showe {

try {
//调用上面类中的方法,因为调用的方法有异常抛出,所有在调用时那么处理要么继续抛出
System.out.println("可能存在异常的代码");
throw MyErroe("1","存在异常");
} catch (Exception e) {
//这里的异常类就是上面类throw出来的 上面throw出来的异常对象就是Exception的子类
//所以这里打印出来的对象就是自定义的异常类
System.out.println(e+"异常类");
}
}


对于枚举在自定义异常类的使用在实际开发中用的比较多,可以多去思考一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: