黑马程序员---异常类

----------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!------------


异常类

概念:

在程序开发过程中,可能存在的错误,有些错误是可以避免的,而有些错误确是意想不到的,在java中把这些可能发生的错误称为异常。

异常类的继承关系图如下所示


一、异常的分类
1.可控式异常
     在java中把那些可以预知的错误,比如从文件中读取数据、对数据库进行操作等,在程序编译时就能对程序中可能存在的错误进行处理,并给出具体的输出信息

 下面我们通过一个实例来说明问题
在项目中创建example类,在该类中加载一个不存在的类,观察发生的异常
  public class example{
         private int num=10;          //成员变量
         public int getNum(){         //成员方法
         return num;                 //返回成员变量值
    }
         public void setNum(int num){     //成员方法
        
         this.num=num;            //设置成员变量的值
         }
        
          public example(){         //类的构造方法
          try{
              Class.forName("com.mingrisoft.test");//装载com.mingrisoft.test包中的test类
          }catch(ClassNotFoundException e){
              e.printStackTrace();
              }
              System.out.println("测试");        //在控制台输出“测试”
              }
              
   public static void main(String args[]){
          example exam=new example();             //创建类的实例
          exam.setNum(8888);                      //调用setNum()方法设置成员变的值
          System.out.println(exam.getNum());       //调用getNum()方法输出成员变的值
          }
    }

运行结果:



2.运行时异常
    在java中有些错误不能被编译时检测,比如在进行除法运算时,除数为零;
    试图把一个不是数字组成的字符串使用Interger类的parseInt方法转换为整数等,
    java的编译器是检测不到的因而能够正常编译,但是在运行是会发生异常
    下面我们通过一个实例来说明问题
    
int number={1,4,7,7,8,9}                         //创建并初始化具有6个元素的数组
     public void setNum(iont index, int value){         //根据索引值index为数组元素赋值value的方法
             
             number[index]=value;}                        //为数组中索引值index出的元素赋值value

             public int getNum(int index){                  //根据索引值index获取数组中对应元素值的方法
            
             return number[index]                          //获取数组中索引值index处的元素
             }
     public static void main(String args[]){
    
        example ex=new example();
         int value=ex.getNum(0);        //调用方法获取数组索引值0处的元素值
         System.out.println(value);
         value=ex.getNum(6);             //创建并初始化具有6个元素的数组索引值6超出数组下标的范围,导致异常
         System.out.println(value);
         value=ex.getNum(8);
         System.out.println(value);
     }

运行结果:


二、获取异常信息

下面通过一个程序来说明问题

 public class example{
          public void printBuglinfo(){     //定义成员方法
          try{
           
              int x=100;                        //定义局部变量
              int y=0;                          //定义局部变量
              int z=x/y;
              System.out.println(x+"除以"+y+"的商是: "+z);
              }catch(Exception ex){
              ex.printStackTrace();                //输出异常到 标准错误流
              System.out.println("getMessage的方法:"+ex.getMessage());                    //使用getMessage()方法输出异常信息
              System.out.println("getLocalizedMessage的方法:"+ex.getLocalizedMessage());  //使用getLocalizedMessage()方法输出异常信息
              System.out.println("toString的方法:"+ex.toString());                       //使用toString()方法输出异常信息
              }
        public static void main(String args[]){
            example ex=new example();
            ex.printBuglinfo();
            }
        }

三、异常的处理
方式一
try
{
    需要被检测的代码;
}
catch(异常类 变量)
{
    处理异常的代码;(处理方式)
}
finally
{
    一定会执行的语句;
}
方式二
通过throws声明或者throw抛出异常
下面通过具体例子来说明问题,两种方式的结合处理异常
public class Demo {
    
        int div(int a,int b)throws Exception//在功能上通过throws的关键字声明了该功能有可能会出现问题。
        {
            return a/b;
        }



        public static void main(String[] args) throws Exception
        {
            Demo d = new Demo();
            try
            {
                int x = d.div(4,0);
                System.out.println("x="+x);
            }
            catch (Exception e)
            {
                System.out.println(e.toString());
            }
            
            System.out.println("over");

        
    }

}

四、自定义异常
创建自定义异常时需要继承自Exception类,并提供有一个String类型形参的构造方法,该形参就是异常的描述。
下面通过两个例子说明问题
例子一
1.首先自定义异常类
public class myException extends Exception { // 创建自定义异常类
    String message; // 定义String类型变量
    
    public myException(String ErrorMessagr) { // 父类方法
        message = ErrorMessagr;
    }
    
    public String getMessage() { // 覆盖getMessage()方法
        return message;
    }
}

2.调用自定义异常类
public class Captor {                          // 创建类
    static int quotient(int x, int y) throws myException { // 定义方法抛出异常
        if (y < 0) { // 判断参数是否小于0
            throw new myException("除数不能是负数");       // 异常信息
        }
          return x / y; // 返回值
    }
    
    public static void main(String args[]) { // 主方法
        try {                                  // try语句包含可能发生异常的语句
            int result = quotient(3, -9);        // 调用方法quotient()
        } catch (myException e) {      // 处理自定义异常
            System.out.println(e.getMessage());     // 输出异常信息
        } catch (ArithmeticException e) {       // 处理ArithmeticException异常
            System.out.println("除数不能为0");     // 输出提示信息
        } catch (Exception e) {                // 处理其他异常
            System.out.println("程序发生了其他的异常");   // 输出提示信息
        }
    }
}


例子二
创建computer类,在累赘有一个计算两个数的最大公约数的方法,如果想该方法传递负整数,该方法就会抛出自定义异常。
1.自定义异常类
public class MyException extends Exception {            
    String message;                            
    public MyException(String ErrorMessagr) {        
        message = ErrorMessagr;
    }
    public String getMessage(){                    
        return message;
    }
}

2.创建Cmputer类并调用自定义异常类
public class Computer {
    public static int getMaxComm(int m , int n) throws MyException{
        if( m <= 0 ||n<=0){
            throw new MyException("传递的参数不是正整数");
        }
        if(m < n){
            int temp = 0;
            temp = m;
            m = n;
            n = temp;
        }
        int r = m % n;
        while(r!=0){
            m = n;
            n = r;
            r = m % n;
        }
        return n;
    }
    public static void main(String[] args) {
        try {
            int m = 122 , n= 0;
            int reslut = getMaxComm(m,n);
            System.out.println(m+" 和 "+n+"的最大共约数是:"+reslut);
        } catch (MyException e) {
            
            e.printStackTrace();
        }
        
    }

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值