Java的异常机制

一.什么是异常:非正常的,不一样寻常的,不是语法错误。java

生活中,医生说你身体某个部位异常,该部位和正常相比,有点不一样功能可能受损。c++

张三开车去上班,正常状况下,顺利到达公司程序员

非正常状况下,车子坏了,走路去公司数据库

异常指的 不是语法错误 ,语法错误编译通不过,不会产生字节码文件,根本不能运行c#

程序中:代码出现错误,程序就会中止运行。数组

 

异常处理是衡量一门语言是否成熟的标准之一。主流的java c++ c# 都有异常处理机制。网络

异常处理可让程序有更好的容错性,使代码更健壮。jvm

传统的c语言是没有异常处理的,此时只能程序员经过使用方法的特定返回值来表示异常状况,而且使用if语句来判断正常和非正常的状况spa

 

 

 

没有异常机制存在的缺点:指针

1.使用方法的返回值表示异常的状况有限,没法穷举全部的异常状况

2.异常处理代码和业务代码混合在一块儿,增大的程序的复杂性

3.随着系统规模不断增大,程序的可维护性极低

 

二.异常体系

针对上述的状况,咱们提出解决办法:

1.把不一样类型的异常状况描述成不一样的类(称之为异常类)

2.分离异常流程代码和正确流程代码

3.灵活处理异常,若是当前方法解决不了,我把异常交给别人来解决

 -------

非正常状况出现后,程序会中断

Error:表示错误,通常指jvm相关的不可修复的错误,如系统崩溃,内存溢出,JVM错误等,由JVM抛出,咱们不用处理。

Exception:表示异常,指程序中出现不正常状况,该问题能够修复(处理异常)

 

常见的exception

NullPointerExeception空指针异常

 

ArrayIndexOutOfBoundsExeception 数组越界异常

数字格式化出问题

 

 

 

 

二.使用try catch捕获单个异常:

异常出现后,程序会中断,因此必须处理异常:

1.该方法不处理,而是声明抛出,由该方法的调用者来处理(throws

2.在方法中使用try catch语句块来处理异常

 

 

使用try catch捕获单个异常,语法:

try{

编写可能出现异常的代码

}catch(异常类型  e){

处理异常的代码

打印异常信息

继续抛出异常

}

注意:try catch都不能单独使用

案例

 

 

 

三.获取和查看异常信息,Throwable类的方法

1.String getMessage()  获取异常的描述信息,缘由(提示给用户的时候,就提示异常信息))

2.String toString() 获取异常的类型和异常描述信息

3.Void printStackTrace() 打印异常的跟踪栈信息并输出到控制台,不须要使用syso输出,它包含了异常的类型,异常的缘由,还包括异常出现的位置,在开发和调试阶段,常常使用这个方法。

注意:如今在catch语句块中,都写e.printStackTrace()

 

 

四.使用try-catch捕获多个异常

一个catch语句,只能捕获一种异常,若是须要捕获多个异常,就得使用多个catch语句

 

 

 

 

try{

编写可能出现异常的代码

}catch(异常类型A  e){

处理异常的代码//打印异常信息//继续抛出异常

}catch(异常类型B e){

处理异常的代码//打印异常信息//继续抛出异常

}

注意:

1.一个catch语句只能捕获一种类型的异常,若是须要捕获多种异常,就得使用多个catch语句

2.代码在一瞬间只能出现一种类型的异常,只须要一个catch捕获,不可能出现多个异常

案例:

 

 

 

五.Finally代码块:表示最终都会执行的代码,不管有没有异常

      何时的代码必须最终执行:

          当咱们在try语句中打开了一些物理资源(磁盘文件/网络链接/数据库链接),咱们都得在使用完以后,最红关闭打开的资源。

finally 的两种语法:

     1.try...finally :此时没有catch来捕获异常,由于此时根据根据应用场景,咱们会抛出异常,本身不处理

     2.try...catch..finally :自身须要处理异常,最终还得关闭资源

 

 

注意:finally不能单独使用

当只有存在try或者catch中调用退出jvm的相关方法,此时finally才不会执行,不然finally永远会执行

System.exit(0);//退出jvm

 

 

注意:若是finallyreturn语句,永远返回finally中的结果,避免该状况

 

 

六.异常的分类:根据在编译时期仍是运行时期取检查异常?

     1.编译时期异常:checked异常,在编译时期,就会检查,若是没有处理异常,则编译失败

     2.运行时异常:runtime异常,在运行时期,检查异常,在编译时期,运行异常不会被编译器检测(不报错)

注意:运行异常,在编译时期,可处理,可不处理

 

 

七.抛出异常:

throw:运用于方法内部,用于给调用者返回一个异常对象,和return同样会结束当前方法

throws:运用于方法声明上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)

throw语句:

     运用在方法内部,抛出一个具体的异常对象

      throw new 异常类型(“异常信息”):终止方法

throw

    通常的,当一个方法出现不正常的状况的时候,咱们不知道方法该返回什么,此时就返回一个错误,在catch语句块中继续向上抛出异常

    Return是返回一个值,throw是返回一错误,返回给该方法

public static int dowork(int num1,int num2){
        System.out.println("beging.......");
        if (num2 == 0){
            System.out.println("有问题");
            throw new ArithmeticException("被除数不能为0");
        }
        System.out.println("-------------------------");
        try{
            int a =num1/num2;
            System.out.println(a+"aaaa");
            return a;
        }catch(ArithmeticException e){
            e.printStackTrace();
            System.out.println("出异常了");
        }
        System.out.println("end.........");
        return 0;
    }
    
    public static void main(String[] args) {
        try{
        int ret=dowork(10,0);
        System.out.println(ret);
        }catch(ArithmeticException e){
            System.out.println(e.getMessage());
        }
    }

 

Throws语句

     若是每个方法都放弃处理异常直接经过throws声明抛出,最后异常会抛到main方法,main方法不出,继续抛出个jvm,底层的处理机制就是打印信息跟踪栈。

 

public static int dowork(int num1,int num2) throws Exception{
        System.out.println("begin.........");
        if(num2==0){
            System.out.println("有问题");
            throw new Exception("被除数不能为0");
        }
        System.out.println("----------------");
        try{
            int a=num1/num2;
            System.out.println(a+"aaaaa");
            return a;
        }catch(ArithmeticException e){
            e.printStackTrace();
            System.out.println("出异常了");
        }
        System.out.println("end.........");
        return 0;
    }
    
    public static void main(String[] args) throws Exception {
        dowork(10,0);
    }
相关文章
相关标签/搜索