欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 异常的捕获及处理

程序员文章站 2022-04-01 11:21:53
...

 

//出现异常的目的是为了解决异常,所以为了能够进行异常的处理,可以使用异常类中提供的printStackTrace()方法进行异常信息的完整输出。
public class TestThrow{
    public static void main(String args[]){
        System.out.println("1、除法计算开始。");
        try{
            int x=Integer.parseInt(args[0]);
            int y=Integer.parseInt(args[1]);
            System.out.println("2、除法计算:"+(x/y));
            System.out.println("****************************");
        }catch(ArithmeticException e){
              e.printStackTrace();
        }finally{
             System.out.println("不管出现异常继续执行");
        }
        System.out.println("3、除法计算结束。");
    }
}
//所有的异常类都是Throwable的子类。而在Throwable下有两个子类。
//Error:指的是JVM错误,即:此时的程序还没有执行 ,如果没有执行用户无法处理;
//Exception:指的是程序运行中产生的异常,用户可以处理。
class MyMath{ //由于存在有throw,那么就表示此方法里面产生的异常交给被调用处处理
    public static int div(int x,int y)throws Exception{
        return x/y;
    }
}
public class TestThrow1{
    public static void main(String args[]){
        try{
             System.out.println(MyMath.div(10,2));        
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
//在主方法抛出的异常,将交给JVM进行处理也就是采用默认的处理方式,输出异常信息,结束程序调用。
//主方法不要加上throws.
public class TestThrow2{
    public static void main(String args[]){
        try{
            throw new Exception("自己定义的异常!");
        }catch{
            e.printStackTrace();
        }
    }
}
//throw:指的是方法之中人为抛出一个异常类对象(这个异常类对象可能时自己实例化或者是抛出已存在的)
//throws:在方法的声明上使用,表示此方法在调用时必须处理异常。
//重要的代码模型:异常的使用格式
//现在要求定义一个div()方法,要求,这个方法在进行计算之前打印提示信息,在计算结束完毕也打印提示信息
//如果在计算之中产生了异常,则交给被调用处进行处理。
class MyMath{ //此时表示div()方法上如果出现了异常交给被调用处处理
    public static int div(int x,int y)throws Exception{
        int result=0;
        System.out.println("开始计算");
        try{
        result= x/y;
        }catch(Exception e){
            throw e;  //继续抛异常
        }finally{
        System.out.println("结束计算");
        }
        return result;
    }
}
public class TestThrow1{
    public static void main(String args[]){    
        try{
          System.out.println(MyMath.div(10,2));    
     }catch{
       e.printStackTrace();
        }
     }
   }
}
//RuntimeException的子类异常,可以由用户选择处理
//assert关键字(断言)在Java中值的是程序执行到某行代码处时一定是预期的结果。
public class TestThrow4{
   public static void main(String args[]){
         int num=10;
         //中间可能经过了20行代码来操作num的内容
         //期望中的内容应该是20
         assert num==20 :"num的内容不是20";
         System.out.println("num="+num);
   }
}
//自定义异常
class AddException extends Exception{
    public AddException(String msg){
        super(msg);
    }
}
public class TestThrow5{
    public static void main(String args[]){
        int num=10;
        try{
        if (num>10)   //出现了错误,应该产生异常
        {
            throw new AddException("数值传递的过大");
        }
        }catch(Exception e){
             e.printStackTrace();
        }
    }
}
//Exception的父类是Throwable,但是在编写代码的时候尽量不要使用Throwable,因为Throwable下还包含了一个Error子类,我们能够处理的只有Exception子类;
//异常处理的标准格式:try、catch、finally、throw、throws;

 Java 异常的捕获及处理

finally往往是在开发中迸行一也资掘释放操作的,如果每次处理异常时都要去考虑所有的异常种类, 那么直接使用判断来进行处理不是更好吗,所以为了能够正确地处理异常, 就必须清楚异常的继承结构以及处理流程。
为了解释异常的继承结构. 首先来观察以下两个异常类的继承关系。

Java 异常的捕获及处理

Java 异常的捕获及处理

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

整个过程就好比方法传递参数一样, 只是根据catch后面的参数类型进行匹配。既然异常擒获只是一个异常类对象的传递过程, 那么依据Java中对象向动向上转型的概念来讲, 所有异常类对象都可以向父类对象转型, 也就证明所有的异常类对象都可以使用Exceplion来接收, 这样就可以简单地实现异常处理了。

Throwable表示的范围要比Exception大。
实际上本程序使用Throwable来进行处理, 没有任何语法问题, 但是却会存在逻辑问题。因为此时出现的(或者说用户能够处理的)只有Exception类型, 而如果使用Throwable接收, 还会表示可以处理Error的错误. 而用户是处理不了Error错误的, 所以在开发中用户可以处理的异常都要求以Exception类为主。

 

处理多个异常时,捕获分为小的异常要放在捕获范围大的异常之前处理;

thrwos关键字主要在方法定义上使用, 表示此方法中不进行异常的处理, 而是交给被调用处处理。

之前的所有异常类对象都是由JVM向动进行实例化操作的, 而现在用户也可以向己手工地抛出一个实例化对象(手工调用异常类的构造方法), 就需要通过throw完成。

Java 异常的捕获及处理

 

RuntimeException类

在Java中为了方便用户代码的编写, 专门提供了一种RuntimeException类。这种异常类的最大特征在于:程序在编译时不会强制性i也要求用户处理异常, 用户可以根据向己的需要有边择性地进行处理, 但是如果没有处理又发生了异常了, 将交给JVM默认处理。也就是说RuntimeExceplion的子异常类, 可以由用户根据需要有选捧性地进行处理。

如果要将字符串转换为int数据类型, 可以利用Integer类进行处理, 因为在Integer类中定义了如下方法。
字符串转换为int: public static int parselnt(String s) throws NumberFormatException;

Java 异常的捕获及处理

写在最后

关注我的公众号【Java剑主】,学习更多有深度的技术文章。本博客不在记录原创博文,请移步公众号获取最新内容。

修道注重根基,熟透原理方能看透事物本质,编程亦如此! Java修炼之道,道心坚不移!踏剑寻梦,不忘初心!

Java 异常的捕获及处理