我是靠谱客的博主 冷艳书本,最近开发中收集的这篇文章主要介绍Java-------异常处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、Java异常是处理程序中错误的一种机制

Java异常是Java提供的用于处理程序中错误的一种机制
    ---所谓错误是指在程序运行的过程中发生的一些异常事件。如除0溢出、数组下标越界、所需要读取的文件不存在;
    ---设计良好的程序应该在异常发生时提供处理这些错误,使得程序不会因为异常的发生而阻断或者产生不可预见的结果;
    ---Java程序的执行过程中如果出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并经被提交给Java运行时系统,这个过程称为抛出异常throw;
    ---当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这个过程称为捕获异常。

二、Java异常处理的关键字有throws、throw、try、catch、finally共5个关键字

        try:将可能抛出异常的代码放在try语句块之内,当try语句块内发生异常时,异常被抛出。

        catch:用于捕获异常。catch用来捕获try语句块中发生的异常。

        finally:finally语句块总是会被执行。它主要用于回收在try块里打开的资源。只有finally块执行完后,才回来执行try或者catch块中的return或者throw语句,如finally中使用了return或throw等终止方法的语句,则不会跳回执行,直接停止。

        throw:用于抛出异常。

        throws:用在方法签名中,用于声明该方法可能抛出的异常。

三、异常处理机制

Java语言提供了异常处理机制,为方法的异常终止和出错处理提供了清楚的接口。
    - 用来在发生运行异常时告诉程序如何控制自身的运行,以防止错误的进一步恶化;
    - 每个方法必须对他可能抛出的异常进行预先声明,在定义方法时,必须声明这个方法可能会抛出哪一种或几种异常。

Java针对可能出现的问题提供了一组异常类,顶级父类为Throwable
    getMessage
    toString
    printStackTrace

四、异常的分类:
    1、Error及其子类:错误,一般指的是虚拟机的错误,是由Java虚拟机生成并抛出,程序不能进行处理所以也不加处理,例如OutOfMemoryError内存溢出、调用栈溢出StackOverFlowError。


    2、RuntimeException及其子类:运行时异常(非受检型异常),是由于编程bug所导致,希望越早发现越好,所以不进行处理,直接中断报错即可,编程人员针对报错信息修改程序bug来解决问题。


    3、Exception及其子类中除了RuntimeException及其子类之外的其它异常:受检型异常(非运行时异常),这类异常属于明知道可能出现,但是没有办法杜绝的异常。这类异常一般采用try/catch或者throws声明抛出的方式进行异常处理,当程序出现了非正常情况,尽量保证程序正常结果,而不是立即中断。


    - 受检型异常:明知道存在这种异常的可能,但是没有办法杜绝,所以必须进行编码异常处理必须进行编码处理,否则编译失败。处理方法有2个try/catch结果或者throws声明抛出;
    - 非受检型异常:这种异常不需要进行处理,发现的越早越好可以编码处理,也可以不用处理。

        Throwable类是Java异常类型的顶层父类,一个对象只有是Throwable类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别

五、5种常见的运行时异常类型
5.1、ArithmeticException数学异常,/ by zero是异常的说明信息。

 int k=0;
 System.out.println(10/k);

解决方案:在执行除法计算之前,进行分母是否为0的判断

5.2、ArrayIndexOutOfBoundsException数组下标越界,数组下标的取值范围为[0,length-1]。

int[] arr=new int[5];
System.out.println(arr[5]);

解决方案:通过下标访问数组元素时,首先对数据下标进行范围判断

5.3、NullPointerException空指针异常,针对null对象调用方法。

  Object obj=null;
  System.out.println(obj.toString());

解决方案:必须保证针对引用类型变量调用方法之前,变量不能为null;否则有可能为空时,先进行null值判断,非空再调用方法String.valueOf(obj)。    
5.4、ClassCastException引用类型转换时异常,将变量强制转换为不兼容的类型

  Object obj = new Random();
  int year=((Date) obj).getYear()+1900;

解决方案:进行强制类型转换之前首先使用instanceof运算符进行类型兼容性的判断

    Object obj = new Random();
    if (obj instanceof Date) {
            int year = ((Date) obj).getYear() + 1900;
    }

5.5、NumberFormatException数据格式异常

String str="123a";
int kk=Integer.parseInt(str);

解决方案:进行数据类型转换之前,针对字符串内容进行格式判断,推荐使用正则式。

    String str = "123a";
    boolean res = true;
    for (int i = 0; i < str.length(); i++) {
        char tmp = str.charAt(i);
        if (tmp > '9' || tmp < '0') {
            res = false;
            break;
        }
    }
    if (res) {
        int kk = Integer.parseInt(str);
        System.out.println(kk);
    } 

六、 异常的捕获和处理

    try{  
        try代码段中包含可能产生异常的代码,有人称为陷阱代码,
        在执行过程中如果出现了异常,则异常之后的java语句不会
        执行。转而执行catch部分的代码
    } catch(SomeException e){  可以写多个
        try后可以跟一个多个catch代码段,针对不同异常执行不同
        的处理逻辑。当异常发生时,程序会中止当前的流程,根据获
        取异常的类型去执行响应的代码段。注意异常类型判定时是从
        上向下逐个判断的。
    }finally{
        finally代码是无论是否发生异常都会执行的代码
    }

6.1、 throws--用在方法签名中,用于声明该方法可能抛出的异常,要求谁调用谁处理这个异常。
        主方法上也可以使用throws抛出。如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。

public void pp() throws Exception{}

6.2、try/catch结构的问题:一个try结构后面可以跟无数个catch结构。

    try {
            ss = sc.nextLine();
            age = Integer.parseInt(ss);
    } catch (NumberFormatException e) {
    //异常类型的判定不是最佳匹配,而是逐一匹配,一旦匹配成功,则不会继续进行匹配
    //必须小在前大在后
            System.out.println(ss);
            System.out.println("数据格式错误!");
        } catch (Exception e) {
            System.out.println("其它问题!");
        }

6.3、允许在catch中声明多个类型。
        注意:多个异常类型不要出现父子异常,如果需要写父不写子即可。

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int age = -1;
    String ss = null;
    try {
        ss = br.readLine();
        age = Integer.parseInt(ss);
    } catch (NumberFormatException | IOException e) {
        System.out.println("其它问题!");
    } 
    System.out.println(age);

强调:catch只匹配成功一次即可,注意不是最佳匹配。

catch结构中的e是用于指代陷阱代码中的异常对象。

最后

以上就是冷艳书本为你收集整理的Java-------异常处理的全部内容,希望文章能够帮你解决Java-------异常处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部