异常|异常体系图|练习题


练习题

计算器接口具有work方法,功能是运算,有一个手机类Cellphone, 定义方法testWork 测试计算功能,调用计算接口的work方法, 要求调用CellPhone对象的testWork方法,使用上匿名内部类

package eunm;

public class dd {
    public static void main(String[] args) {
        Cellphone cellphone = new Cellphone();
        
        cellphone.testWork(new ICalculate() {
            @Override
            public double work(double n1, double n2) {
                return n1 + n2;
            }
        }, 342);
        
        cellphone.testWork(new ICalculate() {
            @Override
            public double work(double n1, double n2) {
                return n1+n2;
            }
        },23,14);
    }
}

interface ICalculate{
    //work方法是完成计算,怎么完成计算是匿名内部类完成
    public double work(double n1, double n2);
}

class Cellphone{
    //当调用testWork方法 直接传入一个实现了ICalculate接口的匿名内部类即可
    public void testWork(ICalculate iCalculate,double n1, double n2){
        double result = iCalculate .work(n1, n2);//动态绑定
        System.out.println(result);
    }
}

1.有一个父迎工具接口类Vehicles

2.有Horse类和Boat类分别实现Vehicles

3.创建交通工具工厂类,有两个方法分别获得交通工具Horse和Boat

4.有Person类, 有name和Vehicles属性, 在构造器中为两个属性赋值

5.实例化Person对象”唐僧”,要求般情况下用Horse作为交通工具,遇到大河时用Boat作为交通工具

package eunm;

public class EnumDetail {
    public static void main(String[] args) {
        //5.实例化Person对象"唐僧”,要求一般情况下用Horse作为交通工具,遇到大河时用Boat作为交通工具
        Person person = new Person("唐僧"new Horse());//
        person.passRiver();
        person.passRode();
        person.passRiver();
        person.passRiver();
        person.passRiver();
        person.passRode();
        person.pssAir();
    }
}

//1.有一个交通工具接口类Vehicles
//2.有Horse类和Boat类等分别实现Vehicles
interface Vehicles {
    public void work();
}

class Horse implements Vehicles {
    @Override
    public void work() {
        System.out.println("ma");
    }
}

class Boat implements Vehicles {
    @Override
    public void work() {
        System.out.println("chuang");
    }
}

class Airport implements Vehicles {
    @Override
    public void work() {
        System.out.println("feiji");
    }
}

//3.创建交通工具工厂类,有两个方法分别获得交通工具Horse和Boat等
class AAA {
    //需求=》马儿始终是同一匹
    //饿汉式
    //1 类的内部直接创建对象
    private static Horse horse = new Horse();//

    //2 构造器私有化
    private AAA() {
    }

    //3 向外暴露一个静态的公共方法 返回对象
    public static Horse getHorse() {
        return new Horse();
    }

    public static Boat getBoat() {
        return new Boat();
    }

    public static Airport getAirport() {
        return new Airport();
    }
}

//4.有Person类, 有name和Vehicles属性,在构造器中为两个属性赋值
class Person {
    private String name;
    private Vehicles vehicles;

    public Person(String name, Vehicles vehicles) {
        this.name = name;
        this.vehicles = vehicles;
    }

    //把具体要求封装成方法
    public void passRiver() {
        //如何不浪费 在构建对象传入的交通工具对象
        //vehicles instanceof Boat 是判断当前的vehicles 是不是Boat
        //(1) vehicles = null : vehicles instanceof Boat => false
        //(2) vehicles =马对象: vehicles instanceof Boat => false
        //(3) vehicles =船对象: vehicles instanceof Boat  => true
        if (!(vehicles instanceof Boat)) {
            //向上转型 多态
            vehicles = AAA.getBoat();
        }
        //使用接口调用
        vehicles.work();
    }

    public void passRode() {
        //vehicles instanceof Horse 是判断当前的vehicles 是不是Horse
        if (!(vehicles instanceof Horse)) {
            //向上转型 多态
            vehicles = AAA.getHorse();
        }
        //使用接口调用
        vehicles.work();
    }

    public void pssAir() {
        if (!(vehicles instanceof Airport)) {
            //向上转型 多态
            vehicles = AAA.getAirport();
        }
        //使用接口调用
        vehicles.work();
    }
}

异常

执行过程中所发生的异常事件可分为两大类

  1. Error(错误): Java虚拟机无法解决的严重问题。如: JVM系统内部错误、资源 耗尽等严重情况。比如: StackOverflowError[栈溢出]和OOM(out of memory), Error 是严重错误,程序会崩溃。

  2. Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针 对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中 断等等,Exception 分为两大类:运行时异常[程序运行时,发生的异常]和编 译时异常[编程时,编译器检查出的异常]。

异常体系图

异常|异常体系图|练习题
异常|异常体系图|练习题

异常处理

异常|异常体系图|练习题
异常|异常体系图|练习题

================================================================

异常|异常体系图|练习题
throws处理机制图

try-catch异常处理

异常|异常体系图|练习题

1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块.

2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch.

3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等) 则使用如下代码- finally { }

package eunm.Try;

public class TryCatch {
    public static void main(String[] args) {
        /*
        1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块.
        2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch.
        3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)
        则使用如下代码- finally { }
         */

        //快捷键ctrl+alt+t
        try {
            String str = "1ewtwe4atg";
            int a = Integer.parseInt(str);
            System.out.println("数字" + a);
        } catch (NumberFormatException e) {
            System.out.println("异常信息" + e.getMessage());
        } finally {
            System.out.println("finally代码块继续执行");
        }
        System.out.println("程序继续");
    }
}

//1.如果try代码块有可能有多个异常

//2. 可以使用多 个catch分别捕获不同的异常, 相应处理

//3.要求子类异常道在前面,父类异常写在后面

package eunm.Try;

public class TryCatch01 {
    public static void main(String[] args) {
        //1.如果try代码块有可能有多个异常
        //2. 可以使用多 个catch分别捕获不同的异常, 相应处理
        //3.要求子类异常道在前面,父类异常写在后面
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());//NullPointerException
            int n1 = 10;
            int n2 = 0;
            int res = n1 / n2;//ArithmeticException
        } catch (NullPointerException e) {
            System.out.println("空指针异常" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("算术异常" + e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
        }
    }
}

class Person {
    private String name = "fa";

    public String getName() {
        return name;
    }
}

1)如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如 果有finally,最后还需要执行finally里面的语句

2)如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执 行catch块中的语句,如果有finally,最后还需要执行finally里面的语句

练习题

如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止

package eunm.Try;

import java.util.Scanner;

public class Excercise {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);//1 创建Scanner对象接收
        int a = 0;
        //2.使用无限循环,去接收一个输入
        do {
            System.out.println("请输入一个整数");
            String inputstr = scanner.next();//把当作一个字符串接收输入
            try {
                //3.然后将该输入的值,转成一个int
                a = Integer.parseInt(inputstr);//4.如果在转换时,抛出异常,说明输入的内容不是个可以转成int的内容
                break;
            } catch (NumberFormatException e) {//5. 如果没有抛出异常,则break 该循环
                System.out.println("你输的不是整数");
            }
        } while (true);
        System.out.println("你输入的值是" + a);
    }
}

 public void f2() throws Exception {
        /*
         创建一个文件流对象
    1. 这里的异常是个FiLeNotFoundException 编译异常
    2. 使用前面讲过的try-catch-finally
    3. 使用throws ,抛出异常,让:调用f2方法的调用者(方法)处理
    4. throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
    5. throws 关键字后也可以是异常列表,即可以抛出多个异常
         */

        FileInputStream fis = new FileInputStream("d:aa.txt");
    }

细节

1)对于编译异常,程序中必须处理,比如try-catch或者throws

2)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理

3)子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要 么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型

4)在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必 throws

细节:

异常|异常体系图|练习题
异常|异常体系图|练习题
异常|异常体系图|练习题

练习题

编写应用程序,接收命令行的两个参数(整数),计算两数相除。 计算两个数相除,要求使用方法cal(int n1, int n2) 对数据格式不正确(NumberformatException)、缺少命令行参数 (ArrayIndexOutOfBoundsException)、除0进行异常处理(ArithmeticException)。

package eunm.Throws;

public class aa {
    public static void main(String[] args) {
        try {
            //先验证输入的参数个数是否正确
            if (args.length != 2) {
                throw new ArrayIndexOutOfBoundsException("参数个数不对");
            }
            //先把接收到的参数转成整数
            int n1 = Integer.parseInt(args[0]);
            int n2 = Integer.parseInt(args[1]);
            double res = cal(n1, n2);//该方法可能抛出ArithmeticException
            System.out.println("计算结果" + res);

        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());
        } catch (NumberFormatException e) {
            System.out.println("参数格式不正确需要输出整数");
        } catch (ArithmeticException e) {
            System.out.println("出现了除0的异常");
        }
    }

    public static double cal(int n1, int n2) {
        return n1 / n2;
    }
}

原文始发于微信公众号(易小琳):异常|异常体系图|练习题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/251510.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!