Java中的异常
简介:
Java程序在运行的时候,我们总是希望它能够按照设想中的步骤去执行,得到正确的结果,但是事实往往不如人意,一些事情会阻止程序的运行,这就是异常。异常发生时,我们要会正确的处理而不是让它“自生自灭”,也不是立即退出更不是将错误的数据传给用户。
Java中的异常可以是函数中的语句执行引发的,也可以是程序员通过throw语句手动抛出。只要Java中产生异常,就会用一个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序处理异常。
Throwable类是Java中异常的顶级父类,一个对象是Throwable的实例,然后才是一个异常对象,才能被异常处理机制识别。
原文:https://www.cnblogs.com/lulipro/p/7504267.html
Java异常分类和分类结构图
Throwable父类下有两个子类:Error类和Exception类
错误:Error类以及它的子类的实例,代表JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此更因该关注Exception类以及其下子类。
异常:Exception类及其子类,代表程序运行时发送的各种不期望发生事件。可以被Java异常处理机制使用,是异常处理的核心。

异常分为两类:
非检查异常:Error类和RuntimeException类以及他们的子类。在javac编译时不会提示和发现这些异常,不要求在程序处理这些异常。所以如果愿意,我们可以通过(try...catch...finally或者throws)处理这些异常,也可以不处理。对于这些异常,我们应该通过修正代码,而不是通过异常处理机制处理。这样的异常多半是因为代码错误而引起的。如数组下标越界异常ArrarIndexOutOfBoundsException,除零错误ArrithmeticException,错误的强制转型错误ClassCaseException,使用空得对象异常NullPointerException。
检查异常:除了Error类和RuntimeEception的其他异常。javac强制要求程序员为这样的异常做预备工作(使用try...catch...finally或者throws),否则编译不会通过。这样的异常是因为程序运行异常引起的。如SQLException,IOException,ClassNotFoundException。
检查和非检查都是对于javac来说比较好理解。
package TiMutest; import java.util.Scanner; public class Main2 { public static void main (String []args){ ErrorException(); } public static void ErrorException(){ Scanner can = new Scanner(System.in); int num1 = can.nextInt(); int num2 = can.nextInt(); int result = devide(num1,num2); System.out.println("result"+result); can.close(); } public static int devide(int num1,int num2){ return num1/num2; } }
//————————————————————————————————————————————————————
结果:
2 0 Exception in thread "main" java.lang.ArithmeticException: / by zero //异常线程,异常类型,以及说明文字 at TiMutest.Main2.devide(Main2.java:18) //异常的位置行数,异常的方法 at TiMutest.Main2.ErrorException(Main2.java:13) at TiMutest.Main2.main(Main2.java:7)
异常处理基本语句
在编写代码处理异常时,对于检查异常,有两种不同的处理方式:使用try...catch...finally语句处理。或者,在函数签名中throws声明交给函数调用者caller处理。
try...catch...finally语句
try{
- try块中方可能发生异常的代码
- 如果执行完try且不发生异常,则直接去执行finally和finally后面的代码(如果有的话)
}catch(SQLException SALexception){
- 每一个catch块用于扑抓并处理一个特定的异常,或者这个异常类型的子类。
- catch后面括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配的,则虚拟机将使用这个catch块来处理异常。
- 在catch块中可以使用这个块的异常参数来获取异常的信息。异常参数是这个catch块中的局部变量,其他块不能访问。
- 如果当前try块中发生的异常在后续的所有catch中都没有扑抓到,则先去执行finally,然后到这个函数的外部caller中匹配异常处理器。
- 如果try中没有异常,则所有的catch块将被忽略。
}catch(Exception exception){
}finally{
- finally块通常是可选的。
- 无论异常是否发生,异常是否匹配被处理,finally都会执行。
- 一个try块至少要有一个catch块,否则,至少有一个finally块。但是finally不是用来处理异常的,finally是不会用来扑抓异常的。
- finally主要做一些清理工作,如流的关闭,数据库连接的关闭等
throws语句
程序员可以通过throw语句抛出一个异常,throw后面必须是一个异常对象。
package TiMutest;
import java.util.Scanner;
public class Main2 {public static void main (String []args){ErrorException();}public static void ErrorException(){Scanner can = new Scanner(System.in);int num1 = can.nextInt();int num2 = can.nextInt();int result = devide(num1,num2);System.out.println("result"+result);can.close();}public static int devide(int num1,int num2){return num1/num2;}
}

浙公网安备 33010602011771号