Java异常

一、异常概念

        在使用计算机语言开发项目时,即使程序员把代码写得尽善尽美,在系统运行过程中仍会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:用户输入数据的格式,读取文件是否存在,网络是否保持通畅等等。
异常: 在Java语言中,将程序执行中发生不正常的情况称为“异常”
Java程序在执行过程中所发生的异常事件可分为两类:
1)Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理
2)Exception:因为编程错误或偶然的外在因素导致的一般性问题,可以使用异常处理机制进行解决 。例如:数组下标越界,试图读取不存在的问题,网络连接中断
        Error类型的异常我么无法控制,但是Expection类型的异常我们可以解决,对于这种异常,一般有两种解决办法:一是遇到异常就终止程序的运行。另一种是在编写程序时就考虑对异常的检测,异常信息的提示,以及异常的处理。
Throwable类是我们异常体系中最大的类,它可以代指我们程序中遇到的异常,这个类下面有两个子类
1.Error:Java虚拟机内部的问题,也有可能时我们代码书写的问题
2.Exception:因编程问题或偶然情况导致的异常问题,这个类下面也有两个大的子类:
2.1RuntimeException:运行时异常,在编译期间不强制要求处理的异常
2.2继承了Exception但未继承或未间接RuntimeException的子类:这种是编译时异常,我们在编写代码器间强制要求解决。

二、异常处理

2.1 异常捕获

        Java编程语言使用异常机制为程序提供了错误处理能力。没有使用异常机制时,程序遇到异常,程序终止执行,不太友好。如果想在程序出现问题时,程序依然可以执行,就需要我们在编写代码时首先将异常处理机制写好,一旦发生异常,就会按照我们预定的处理机制执行。
例如:

        try {
            int parseInt = Integer.parseInt("a");
            int b = 100;
            int a = 0;
            System.out.println(b/a);
        } catch (ArithmeticException arithmeticException) {
            System.out.println("0不能作为分母");
        } catch (NumberFormatException numberFormatException) {
            System.out.println("数字格式异常");
        } catch (Exception e) {
            System.out.println("系统忙");
        }

假如我们代码中某一行发生了异常且没有进行捕获的话,程序便会终止,后面的代码无法执行。
当我们捕获了这一异常的话,程序便会正常执行。
当程序中可能包含多个异常时,我们可以捕获多个,如上面所示,但是注意:大的异常类一般写在下面,异常类就是从小到大的顺序捕获的,我们还可以在最后加上捕获Exception,这样只要是程序导致的异常都会进行捕获,可以使得程序更加安全。

2.2 finally

finally代码块中的代码一定会执行,无论是否捕获异常,所以将必须要执行的代码逻辑放在finally代码块中
finally代码块不能单独使用,必须结合 try{} 或者 try { } catch() { }

2.3 throws

throws,定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而是交给调用方法进行处理。
任何方法都可以使用throws关键字生命异常类型,包括抽象方法
子类重写父类中的方法,子类方法不能抛出比父类类型更大的异常
使用了throws的方法,调用时必须处理声明的异常,要么使用try{}catch(){},要么继续使用throws声明
A方法调用B方法时,如果B方法内部捕获了异常,那么A方法是不知道的,所以我们都是在调用方法处进行异常的捕获,被调用方法只是进行异常的抛出。

2.4 throw

在方法中,不满足某种条件时,我们便可以主动的抛出一个对象

三、自定义异常

Java中提供了许多异常类供我们捕获异常。而实际的开发中,我们需要在满足某种条件的情况下抛出异常对象,而这种异常类Java中可能没有提供,这是我们便可以自定义异常类。

四、面试题

Java的异常处理机制?
Java异常处理机制可以是程序具有极好的容错性和健壮性。
Java的异常处理机制可以分为3部分,异常处理,抛出异常和异常跟踪栈。
在Java中异常处理语句是由try{}catch(){}finally{},我们可以使用try语句块包裹可能出错的业务代码,catch语句块用来捕获对应类型的异常,finally用来关闭资源。如果try语句块包裹的代码发生异常,系统会创建一个异常对象并交给JVM处理,然后JVM会寻找可以处理这个异常的catch块,并将异常对象交给对应的catch块处理。如果JVM没有找到可以处理异常的catch块,运行环境便会终止,程序会推出。若业务代码打开了某些资源,可以在finally代码块中进行关闭,因为finally语句块中的代码一定会执行(一般情况下:例如在try语句块还没开始程序就异常或者返回,又或者是断电)。
当程序发生异常时,系统会自动抛出异常。除此之外,Java也允许主动抛出异常,当业务代码中某些错误条件满足时,可以使用throw关键字抛出异常对象。这种情况下,方法不知道该如何处理异常,可以在方法声明位置使用throws关键字抛出可能会发生的异常,该异常会被交给JVM。程序在运行的时候,由于各个方法的调用从而形成方法调用栈,异常机制会使异常对象在方法中传播,而异常传播的方向和调用方法的方法相反,由被调用者传播向调用者,这样一级级最终会传播给main方法,如果依然没有处理,JVM会终止程序,并打印异常跟踪栈信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值