• Java异常和Map练习


    Java异常组织结构

    Java语言设计及编写程序的核心是面向对象,对于异常处理Java仍然是以面向对象为核心进行设计错误异常处理。

    任何一个错误/异常的出现都被看做是一个异常对象,异常对象必须属于某个错误/异常类型。java中异常对象的出现导致此方法调用终止,程序将转向异常处理程序。

    异常处理能够让编程者跟踪错误信息,确定程序中的错误异常的位置,从而调试应用程序,使之调整后重新运行。

    1. Throwable 异常的最高级父类

    (1) Error 系统内部的JVM问题,Error任何问题,应用程序问题都无法解决,比如内存爆了

    ① VirtualMachineError

    ② ThreadDeath

    ③ IOError

    (2) Exception 应用程序引起的问题,通过调试程序可以解决

    ① RuntimeException //运行时异常

    ② SQLException //数据库异常

    ③ IOException //文件读写异常

    Java异常Exception分为运行时异常RuntimeException和编译型异常2

    运行时异常只有在程序运行时被发现和处理。

    编译型异常在编译阶段就能被发现并且必须显示处理。

    通常定义自定义异常都是编译型异常。

    方法名称()throws异常类型1,异常类型2{

    throw异常对象;

    }

    异常的捕获和处理

    声明了编译型异常的方法调用时必须进行异常捕获和处理

    使用try块捕获异常或使用throws在调用方法中继续声明

    使用catch块处理try块捕获的异常

    使用finally块强制执行必须执行的代码

    try{

    声明定义了异常的方法调用;

    }catch(Exception e){

    处理异常的代码;

    }finally{

    强制执行必须执行的代码;

    }

    异常常用的方法

    public String e.getMessage();

    public void printStackTrace();

    1.7版本异常新特性

    try{

    调用定义了异常的方法;

    }catch(异常类型1|异常类型2 e){

    异常处理代码;

    }

    异常实例的调用一定会转向异常处理,所以同时只能有一种异常被抛出,抛出以后程序不再执行,所以不会有别的异常。新的语法使用竖线将异常类型隔开,语法更简洁。

    自定义异常

    自定义异常必须直接或间接继承Exception

    通常在Java预定义异常不能满足要求时自定义异常

    自定义异常通常是编译型异常

    自定义异常可以重写父类的相关方法

    /**
     * 编写一个自定义异常类TargetObjectNotExistentException 继承Exception.
     * 此异常类用来在某个范围内查找目标对象而未找到时抛出此异常.
     *
     * 编写一个类,在此类中定义一个在某个范围内查找目标对象的方法,在定义此方法过程中
     * 使用以上定义的异常类.当在某范围内(数组,集合等)查找给定的目标对象找不到时抛出此
     * 异常类对象,从而使程序走向异常处理程序代码.
     *
     * 编写一个测试类包含main方法,调用目标查找对象的方法,测试自定义异常类的使用,体
     * 验自定义异常类的定义,应用及处理异常的过程.
     */
    
    package exceptions;
    
    public class TargetObjectNotExistentException extends Exception{
    
        public static final String MESSAGE = "检测到非法词汇!";
    
        public TargetObjectNotExistentException(){
    
        }
    
        //此方法返回自定义异常信息
        @Override
        public String getMessage() {
            return MESSAGE;
        }
    
        //此方法返回异常轨迹
        @Override
        public void printStackTrace() {
            System.err.println(MESSAGE);
            super.printStackTrace();
        }
    }
    /**
     * 编写一个自定义异常类TargetObjectNotExistentException 继承Exception.
     * 此异常类用来在某个范围内查找目标对象而未找到时抛出此异常.
     *
     * 编写一个类,在此类中定义一个在某个范围内查找目标对象的方法,在定义此方法过程中
     * 使用以上定义的异常类.当在某范围内(数组,集合等)查找给定的目标对象找不到时抛出此
     * 异常类对象,从而使程序走向异常处理程序代码.
     *
     * 编写一个测试类包含main方法,调用目标查找对象的方法,测试自定义异常类的使用,体
     * 验自定义异常类的定义,应用及处理异常的过程.
     */
    
    package until;
    
    import exceptions.TargetObjectNotExistentException;
    import objects.Employee;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class UseMapTrouble {
        //先new一个模拟的员工数据库类
        Employee emp = new Employee();
    
        public Employee queryEmployee(String str)throws TargetObjectNotExistentException {
    
            //获取所有用户信息存进集合employeeMap里
            Map<String, Employee> employeeMap = emp.getEmployeeMap();
    
            //如果传过来的查询键是非法词汇,则抛出自定义的异常
            if (str.equals("国家主席")){
                throw new TargetObjectNotExistentException();
            }
    
            //通过键获取到对应的值,返回该值对象
            Employee employee = employeeMap.get(str);
    
            //把对象作为返回结果
            return employee;
    
        }
    
    }
    
    
    package objects;
    
    /**
     * 定义一个员工类,模拟数据库存2名员工数据。最后实现的功能是输入字符串键"总工程师"可以返回对象曾誉,如果输入国家主席,会报自定义异常,检测到非法词汇!
     */
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    public class Employee {
        private String empName;
        private String empid;
    
        //定义一个Map集合,存储员工键值,键是员工职位,值是员工姓名和ID
        private static Map<String, Employee> employeeMap = new HashMap<>();
    
        static {
    
    
            Employee emp0 = new Employee();
            emp0.setEmpName("曾誉");
            emp0.setEmpid(UUID.randomUUID().toString());    //一般把id定义为String类型,再把UUID调用toString转换成String类型存进去
    
            Employee emp2 = new Employee();
            emp2.setEmpName("史老师");
            emp2.setEmpid(UUID.randomUUID().toString());
    
            //将员工对象存入Map集合,键是员工职位,值是员工姓名和ID
            employeeMap.put("总工程师",emp0);
            employeeMap.put("董事长",emp2);
    
        }
    
        public String getEmpName() {
            return empName;
        }
    
        public void setEmpName(String empName) {
            this.empName = empName;
        }
    
        public String getEmpid() {
            return empid;
        }
    
        public void setEmpid(String empid) {
            this.empid = empid;
        }
    
        public static void setEmployeeMap(Map<String, Employee> employeeMap) {
            Employee.employeeMap = employeeMap;
        }
    
        //定义一个返回员工集合的方法供其它类调用
        public static Map<String,Employee> getEmployeeMap(){
            return employeeMap;
        }
    
    }
    
    
    import exceptions.TargetObjectNotExistentException;
    import objects.Employee;
    import until.UseMapTrouble;
    
    import java.util.Map;
    import java.util.Scanner;
    
    /**
     * 编写一个自定义异常类TargetObjectNotExistentException 继承Exception.
     * 此异常类用来在某个范围内查找目标对象而未找到时抛出此异常.
     *
     * 编写一个类,在此类中定义一个在某个范围内查找目标对象的方法,在定义此方法过程中
     * 使用以上定义的异常类.当在某范围内(数组,集合等)查找给定的目标对象找不到时抛出此
     * 异常类对象,从而使程序走向异常处理程序代码.
     *
     * 编写一个测试类包含main方法,调用目标查找对象的方法,测试自定义异常类的使用,体
     * 验自定义异常类的定义,应用及处理异常的过程.
     */
    
    public class Test {
        public static void main(String[] args) {
            //new一个Scanner接收用户输入
            Scanner input = new Scanner(System.in);
            //new一个自定义的异常类
            UseMapTrouble use = new UseMapTrouble();
    
            /**
             * 请用户输入需要查询的职位,如果输入国家主席,会报自定义异常,检测到非法词汇!
             */
    
            System.out.println("请您输入需要查询的职位: 总工程师  董事长");
            //使用try和catch块尝试捕获异常
            try {
                //new一个Employee类型接收queryEmployee方法的查询结果
                Employee emp = use.queryEmployee(input.next());
                System.out.println(
                        "员工姓名:"+emp.getEmpName()
                        +"
    员工ID:"+emp.getEmpid()
                );
            } catch (TargetObjectNotExistentException e) {
                //打印异常轨迹和异常信息
                e.printStackTrace();
                System.out.println(e.getMessage());
            }
    
        }
    }
  • 相关阅读:
    JS和Flash相互调用
    xml的应用
    随机验证码
    模块 time
    第一天 注册成功
    我的第一篇博客
    git
    2018-02-27
    25
    建站之星
  • 原文地址:https://www.cnblogs.com/zengyu1234/p/14998399.html
Copyright © 2020-2023  润新知