Java异常组织结构
Java语言设计及编写程序的核心是面向对象,对于异常处理Java仍然是以面向对象为核心进行设计错误异常处理。
任何一个错误/异常的出现都被看做是一个异常对象,异常对象必须属于某个错误/异常类型。java中异常对象的出现导致此方法调用终止,程序将转向异常处理程序。
异常处理能够让编程者跟踪错误信息,确定程序中的错误异常的位置,从而调试应用程序,使之调整后重新运行。
- 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()); } } }