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());
        }

    }
}
原文地址:https://www.cnblogs.com/zengyu1234/p/14998399.html