第十章 异常处理

1.练习回顾

 ①ICourse接口

public interface ICourse {
    String skill();
}

②课程类:

public class JavaCourse implements ICourse{
    @Override
    public String skill() {
        return "学习了Java课程\n能够使用Java开发DVD管理系统";
    }
}
public class HtmlCourse implements ICourse{
    @Override
    public String skill() {
        return "学习了HTML\n能够使用HTML开发网上花店";
    }
}
public class CsharpCourse implements ICourse{
    @Override
    public String skill() {
        return "学习了C#\n能够使用C#开发KTV系统";
    }
}

③学生类:

public class Student {
    String name;

    public Student(String name) {
        this.name = name;
    }
    public void study(ICourse course){
        System.out.println(this.name+course.skill());
    }
}

④测试类

public class Test {
    public static void main(String[] args) {
        JavaCourse java =new JavaCourse();
        HtmlCourse html = new HtmlCourse();
        CsharpCourse csharp =new CsharpCourse();

        Student s = new Student("王五");
        s.study(java);
        s.study(html);
        s.study(csharp);
    }
}

2.异常

2.1 什么是异常

生产生活中:出现的意外情况;

程序中:在代码编译或运行过程中,程序出现错误,导致程序不能正常执行。

2.2 处理异常的目的

        程序一旦发生异常,会导致程序中途退出(程序崩溃),所以需要进行处理,处理之后,让程序正常执行。

2.3 异常分类

 Throwable中的方法:

        printStackTrace():打印异常的堆栈信息,追根溯源;

        getMessage():获取异常的详细信息。

Error异常一般是jvm发生的错误,表示严重的问题,通过代码无法处理,一般不应该试图去捕获。

 Exception:异常

编译时异常: 可以预测的,检查异常,需要进行强制的异常处理或者抛出。ParseException(数据转换异常)
运行时异常: 在运行过程中发生的异常,不作强制处理要求,非检查异常。
常见的异常:
        InputMismatchException(输入不匹配异常)
        ArithmeticException(数学运算异常)
        ArrayIndexOutOfBoundsException(数组下标越界异常)
        NullPointerException(空指针异常)
        NumberFormatException(数据转换格式错误) 

2.3 对异常进行处理

关键字:
        try:监视、catch:捕获、finally:最终处理、throw:抛出、throws:声明
        做异常处理的目的,就是程序触发异常的时候,避免程序崩溃,确保程序能正常执行。

 异常处理的方式:

在目标代码上加try..catch,自己做异常处理;

②在代码所在的方法上添加异常抛出声明,让方法的调用者进行异常处理。

2.3.1 捕获异常

① try...catch

应用场景:可能发生异常的代码

try{
         // 可能发生异常的代码
}catch( 异常类型 对象 ){
         处理异常
}

② try...catch...finally

应用场景:存在必须执行的代码(释放资源的代码)

(finally块中的代码,无论代码是否出现异常,一定会执行,并且会在return之前运行)

③多重catch

应用场景:需要精确的把控各种异常的处理;

(先捕获细的异常,再捕获粗的异常)

        多分支捕获,按从上到下的次序依次匹配,所以细粒度的异常要放到上面,粗粒度的异常要放到下边

 ④try...finally

        发生异常时finally的代码会被执行,但是因为没有catch处理异常,所以程序会崩溃

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a,b;

        try{
            System.out.println("输入第一个数");
            a = scanner.nextInt();
            System.out.println("输入第二个数");
            b = scanner.nextInt();

            int res = a/b;
            System.out.println(a+"/"+b+"="+res);
            int[] nums = new int[2];
            nums[2] = res;

        }catch (InputMismatchException ex){
            System.out.println("输入出错了!");
            System.out.println("错误内容"+ex.getMessage());
            ex.printStackTrace();
        }catch (ArithmeticException ex){
            System.out.println("计算出错了!");
            System.out.println("错误内容:"+ex.getMessage());
            ex.printStackTrace();
        }catch (ArrayIndexOutOfBoundsException ex){
            System.out.println("数组出错了!");
            System.out.println("错误内容:"+ex.getMessage());
            ex.printStackTrace();
        }catch (Exception ex){
            System.out.println("出错了!");
            System.out.println("错误内容:"+ex.getMessage());
            ex.printStackTrace();
        }finally {
            System.out.println("我滴任务完成了!");
        }
        System.out.println("======程序执行结束=====");
    }
}

 3.4.2 手动抛出异常

        用于个性化(特定的业务需求)的异常处理(学生的性别、年龄输入错误)

①throw:

// 在方法中使用:
if( 条件 )
        throw new Exception("错误消息 ")

②throws:

 在方法签名后面使用,声明方法可能抛出的异常,一般会配合检查异常(编译时异常)使用

    //手动抛出异常,在方法上添加抛出声明,对应方法的调用者要做异常处理
    public void setAge(int age) throws AgeException {
        if(age<0|| age>100){
            //手动抛出异常
            //throw new Exception("年龄不是有效值");
            throw new AgeException("年龄不是有效值");
        }else {
            this.age = age;
        }
    }

 2.4.3 自定义异常

        java中给我们提供的异常很多,但是有些满足不了我们的需求,所以此时需要我们自己去定义异常。
//自定义年龄异常
public class AgeException extends Exception{
    public AgeException(String message) {
        super(message);
    }
}

2.5 debug调试模式

①在代码的指定位置设置断点

 ②用debug方式启动程序,当程序执行到断点处时,会自动停下,此时需要通过手动控制程序的执行

 ③手动控制程序执行的主要方式:

stepover(步过) : 遇到单行代码,逐行执行,遇到方法不进入
stepinto(步入): 遇到单行代码,逐行执行,遇到方法会进入方法内部执行

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值