Java 异常的捕获及处理

 

//出现异常的目的是为了解决异常,所以为了能够进行异常的处理,可以使用异常类中提供的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;

 

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

( 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完成。

 

RuntimeException类

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值