java之异常捕获及处理

来源:互联网 发布:能读出身份证的软件 编辑:程序博客网 时间:2024/06/06 00:47

一、处理异常

try{//有可能出异常的语句 } [catch (异常类型 对象) {//异常处理} catch (异常类型 对象) {//异常处理} catch (异常类型 对象) {//异常处理}...] [finally {//不管是否出现异常,都执行的代码}

1、printStackTrace()方法:进行异常信息输出

public class Main {    public static void main(String[] args) {        System.out.println("11");        try {            System.out.println(10 / 0);        } catch (ArithmeticException e) {            e.printStackTrace();        } finally {            System.out.println("11123");        }    }

注意事项:在try出错语句之后的语句不再执行

public class Main {    public static void main(String[] args) {        System.out.println("11");        try {            System.out.println(10 / 0);            // 在try出错语句之后的语句,不再执行了            System.out.println("!!");        } catch (ArithmeticException e) {            System.out.println("出错了");        } finally {            System.out.println("11123");        }    }}

输出结果:
11
出错了
11123

二、Error和Exception的区别
Error:指的是JVM的错误,此时程序还没有执行,用户无法处理的异常
Exception:程序运行中产生的异常,用户可以处理,我们一般说的处理异常就是指的Exception类以及他的子类的异常

三、java中处理异常的流程
1、程序运行出现异常时,JVM会自动根据异常的类型实例化一个与之匹配的异常类对象(此时用户不用去关心new,由系统自动负责处理)
2、产生异常对象后,会判断当前语句上是否存在有异常处理,如果没有,就交给JVM进行默认处理,处理的方式:输出异常信息,而后结束程序调用
3、如果此时存在异常的捕获操作,那么会由try语句来捕获产生的异常类实例化对象,而后与try语句后的每一个catch进行比较,如果有符合的catch捕获类型,则使用当前catch语句进行异常处理,如果不匹配则向下继续匹配catch
4、 不管最后异常处理 是否能匹配,那么都要向后执行,如果此时存在finally语句,那么先执行finally中的代码,但是执行完毕后需要根据之前catch匹配结果来决定如何执行,如果之前已经成功捕获了异常,那么就继续执行fianlly之后的代码,如果没有捕获成功,那么就将此异常交给JVM进行默认处理

四、两点说明
1、在编写多个catch捕获异常的时候,捕获范围大的异常一定要放在捕获范围小的异常之后,否则程序编译错误
2、虽然直接捕获Exception比较方便,但是这样也不好,因为所有的异常都会按照同样一种方式处理,如果在一些要求严格的项目里面,异常一定要分开处理比较好

五、throws关键字
主要用于方法声明上,指的是当方法之中出现异常后交由被调用处处理,调用处不管是都出现异常,都要用try catch进行异常的处理

public class Main {    // 存在throws,表示该方法产生的异常,交给被调用处使用    public static int t(int x, int y) throws Exception {        return x / y;    }    public static void main(String[] args) {        // 不管对与错,都要使用try catch进行处理        try {            System.out.println(t(10, 2));        } catch (Exception e) {            e.printStackTrace();        }    }}

注意:不要在主方法中加上throws,因为加上后异常会抛给JVM进行默认处理

六、throw关键字
在程序之中,可以直接手工的抛出一个异常类的实例化对象

public class Main {    public static void main(String[] args) {        try {            throw new Exception("自己定义的异常");        } catch (Exception e) {            e.printStackTrace();        }    }}

六、throw和throws的区别
throw:指的是在方法中人为抛出一个异常类对象(这个异常类对象可能是自己实例化或者 是抛出已存在的)
throws:在方法的声明上使用,表示此方法在调用时必须处理异常

七、异常的使用格式

public class Main {    public static int t(int x, int y) throws Exception {        int result = 0;        try {            result = x / y;        } catch (Exception e) {            throw e;// 继续向上抛异常,抛给main方法的try catch进行异常输出        } finally {            System.out.println("kkkk");        }        return result;    }    public static void main(String[] args) {        try {            System.out.println(t(10, 0));        } catch (Exception e) {            e.printStackTrace();        } finally {            System.out.println("fianlly");        }    }}

缩写:try…finally

public class Main {    public static int t(int x, int y) throws Exception {        int result = 0;        try {            result = x / y;        } finally {            System.out.println("kkkk");        }        return result;    }    public static void main(String[] args) {        try {            System.out.println(t(10, 0));        } catch (Exception e) {            e.printStackTrace();        } finally {            System.out.println("fianlly");        }    }}

八、RuntimeException类
运行时异常,这种异常类最大特征在于:程序在编译的时候,不会强制性的要求用户处理异常,用户可以根据自己的需要选择性处理,但是如果没有处理又发生异常了,就会交给JVM默认处理,也就是说RuntimeException的子异常类,可以由用户根据需要选择进行处理

Exception与RuntimeException的区别:
Exception是RuntimeException的父类,使用exception定义的异常必须要被处理,而RuntimeException的异常可以选择性处理
常见的RuntimeException异常:ArithmeticException,NullPointerException,ClassCastException

九、断言–assert关键字
在java中断言指的是程序执行到某行代码处时一定是预期的结果,默认情况下,断言是不应该影响程序的运行的,也就是说在java编译程序的时候,断言是不起作用的

public class Main {    public static void main(String[] args) {        int num = 10;        //假设期望num是20        assert num == 20 : "num的内容不是20";        System.out.println("num=" + num);    }}

输出结果:10 (不报错)
启用断言:java-ea 类名

十、自定义异常
java中已经提供了很多异常,但是在实际中异常往往不够用,因此需要自定义一个异常类,如果想要自定义一个异常类,可以选择继承Exception类或者是RuntimeException类

class addException extends Exception {    public addException(String msg) {        super(msg);    }}public class Main {    public static void main(String[] args) {        int num = 20;        try {            if (num > 10) {                throw new addException("数值传递过大");            }        } catch (Exception e) {            e.printStackTrace();        }    }}

报错.addException: 数值传递过大
at 报错.Main.main(Main.java:11)

0 0
原创粉丝点击