7.31异常学习总结

2017-07-31  本文已影响0人  lufaqiang

什么事异常

异常的继承体系

Throwable: 它是所有错误与异常的超类(祖宗类)
    |- Error 错误
    |- Exception 编译期异常,进行编译JAVA程序时出现的问题
        |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

异常的产生过程:

image.png

抛出异常

如何抛出异常

1,创建一个异常对象。封装一些提示信息(信息可以自己编写)。
2,需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象;
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

具体实现
    class ArrayTools{
    //通过给定的数组,返回给定的索引对应的元素值。
    public static int getElement(int[] arr,int index)   {
        /*
        若程序出了异常,JVM它会打包异常对象并抛出。但是它所提供的信息不够给力。想要更清晰,需要自己抛出异常信息。
下面判断条件如果满足,当执行完throw抛出异常对象后,方法已经无法继续运算。这时就会结束当前方法的执行,并将异常告知给调用者。这时就需要通过异常来解决。
            if(arr==null){
            throw new NullPointerException("arr指向的数组不存在");
        }
        if(index<0 || index>=arr.length){
            throw new ArrayIndexOutOfBoundsException("错误的角标,"+index+"索引在数组中不存在");
        }
        int element = arr[index];
        return element;
    }
}

测试类

class ExceptionDemo3 {
    public static void main(String[] args) {
        int[] arr = {34,12,67}; //创建数组
        int num = ArrayTools.getElement(null,2);// 调用方法,获取数组中指定索引处元素
//int num = ArrayTools.getElement(arr,5);// 调用方法,获取数组中指定索引处元素
        System.out.println("num="+num);//打印获取到的元素值
    }
}

申明异常

class Demo{
    /*
    如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws关键字进行声明。
    */
    public void show(int x)throws Exception {
        if(x>0){
            throw new Exception();
        } else {
            System.out.println("show run");
         }
    }
}

throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开

多个异常的情况,例如:
public static int getElement(int[] arr,int index) throws NullPointerException, ArrayIndexOutOfBoundsException {
    if(arr==null){
        throw new NullPointerException("arr指向的数组不存在");
    }
    if(index<0 || index>=arr.length){
        throw new ArrayIndexOutOfBoundsException("错误的角标,"+index+"索引在数组中不存在");
    }
    int element = arr[index];
    return element;
}

捕获异常try…catch…finally

class ExceptionDemo{
    public static void main(String[] args){ //throws ArrayIndexOutOfBoundsException
        try {
              int[] arr = new int[3];
            System.out.println( arr[5] );// 会抛出ArrayIndexOutOfBoundsException
            当产生异常时,必须有处理方式。要么捕获,要么声明。
        }
        catch (ArrayIndexOutOfBoundsException e) { //括号中需要定义什么呢?try中抛出的是什么异常,在括号中就定义什么异常类型。 
            System.out.println("异常发生了");
        } finally {
              arr = null; //把数组指向null,通过垃圾回收器,进行内存垃圾的清除
}
        System.out.println("程序运行结果");
    }
}

运行时期异常

异常练习

题目:1.编写如下异常类:
空异常(NullException ,年龄低异常(LowAgeException),年龄高异常(HeightAgeException),
工资低异常(LowSalaryException),工资高异常(HighSalaryException),身份证非法异常(IdCardException)
2.编写一个员工类,
(1) 有属性:
编号,姓名,年龄,工资,身份证号码,员工人数(10),员工工资总额(10000)
(2) 有构造器:
构造器1:设置编号,年龄,姓名;如果年龄小于18,抛出年龄低异常;如果年龄大于60
抛出年龄高异常,如果姓名为null或为空字符串,抛出空异常。
构造器2:设置工资,设置身份证号码;如果工资低于600,抛出工资低异常。
如果身份证不是18位,抛出身份证非法异常。
(3) 有方法
增加工资 addSalary(double addSalary),抛出工资高异常,当增加后的工资大于员工工资总额时,抛出此异常。
减少工资 minusSalary(double minusSalary), 抛出工资低异常,当减少后的工资低于政府最低工资时,抛出工资低异常。
显示员工工资总额方法:showTotalSalary(),抛出空异常,当工资总额为0时,抛出此异常。
显示员工人数:voidshowTotalEmployee(),抛出空异常。当员工人数为0时,抛出此异常
3.编写main主测试类
分别生成3个员工,测试构造方法的异常抛出。
每个员工分别增加,减少工资,测试方法的异常。
显示员工的人数和工资总额。
编写异常类:NullException,LowAgeException,HeightAgeException,LowSalaryException,HighSalaryException,IdCardException
如:

public class NullException extends Exception {
    public  NullException(){
        super();
    }
    public  NullException(String message){
        super(message);
        
    }
}

编写员工类:

public class Employee {
    private int id;
    private String age;
    private int name;
    private double salary;
    private String idCard;
    private int numble=10;
    private double sum=10000;
    public Employee(){      
    }
   public Employee(int id,int age,String name) throws Exception{
       
       if(age<18){
           throw new LowAgeException("年龄太小");
       }
       if(age>60){
           throw new HeightAgeException("年龄太大");
       }
       if(name==null||name==""){
           throw new NullException("空异常");
       } 

   }
   public Employee(double salary,String idCard) throws Exception{
       this.salary=salary;
       if(salary<600){
           throw new LowSalaryException("工资低异常"); 
       }
       if(idCard.length()!=18){
           throw new IdCardException("身份证非法异常"); 
       } 
   }
   public void AddSalary(double addSalary,double minSalary) throws Exception{
       salary+=addSalary;
       System.out.println(salary);
       if(salary>sum){
           throw new HighSalaryException("工资高异常");
       }else{
           System.out.println(salary);
       }
       salary-=minSalary;
       if(salary<500){
           throw new LowSalaryException("工资低异常");
       }else{
           System.out.println(salary);
       }
       
      
       } 
   public void zxs(double salary, int numble ) throws Exception{
       System.out.println(salary);
       System.out.println(numble);
       if(salary==0){
               throw new NullException("空异常");  
           }
           if(numble==0){
               throw new NullException("空异常");   
           }
   }
}

编写main主测试类

public class testDamo {
public static void main(String[] args)throws Exception {
    try{
    Employee exception1 =new Employee(001,20,"蛋1");
    //Employee exception2 =new Employee(002,20,"蛋2");
    //Employee exception3 =new Employee(700,"123456789123456789");
    
    //exception3.AddSalary(9500,5600);
    exception1.zxs(0, 0);

    }catch(LowAgeException e){
        
        e.printStackTrace();
    }
    catch(HeightAgeException e){
        e.printStackTrace();
    }
    catch(NullException e){
        e.printStackTrace();
    }
    
}
}
上一篇下一篇

猜你喜欢

热点阅读