Java自定义异常与练习

异常的分类

  • 非运行时异常(Checked Exception)
    Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常。
  • 运行时异常(Runtime Exception/Unchecked Exception)
    RuntimeException类直接继承自Exception类,称为运行时异常。Java中所有的运行时异常都直接或间接的继承自RuntimeException。
    Java中所有的异常类都直接或间接的继承自Exception。
    异常的处理
    一、对应非运行时异常,必须对其进行处理。处理方式有两种:
    □使用try…catch…finally语句块进行捕获
    □在产生异常的方法所在的方法声明throws Exception
    二、对于运行时异常,可以不对其进行处理,也可以对其进行处理。一般情况下都不对其进行处理。
    在使用Java API的方法时会产生异常,由于实际的需要,我们需要创建和使用自定义异常。使用全新的异常类,应用到系统程序中。
    在介绍自定义异常时,首要先谈谈什么要使用自定义异常,使用自定义异常的好处。创建自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新的含义;可以显示代码多个位置之间的错误的相似处,也可区分代码运行时可能出现的相似问题的一个或多个错误,或给出应用程序中一组错误的特殊含义。
    应用场景
    服务器的基本作用是处理与客户机的通信,若使用标准Java API(如java.io和java.net包中的类)来编写服务器,则可使编写的代码在多个位置抛出IOException。在设置服务器、等待客户机连接和获取通讯流时,可抛出IOException,在通信期间及试图断开连接时,也会抛出IOException。简而言之,服务器的各个部分都是引发IOException。
    对于服务器而言,这样IOException意义不尽相同。虽然由同一异常类型表示,但与各个异常先关的业务含义存在差异,报告和恢复操作也不相同。所以,可以将一个异常集与服务器配置和启动问题关联,将另一个异常集与客户机通讯的实际行动关联,将第三个异常集与服务器关闭任务关联。使用自定义异常,可采用对应用程序有意义的方式来灵活地表示错误。
    为此,我们需要使用自定义异常来定为问题,定位问题与异常实际准确的位置。
    自定义异常类过程
    1. 多数情况下,只需要继承异常类Exception, 经常需要定义一个或多个构造函数,以在对象中存储错误消息。
    扩展:
  • 类java.lang.Throwable是所有异常类的基类,它包括两个子类:Exception和Error,Exception类用于描述程序能够捕获的异常,如ClassNotFoundException。Error类用于指示合理的应用程序不应该试图捕获的严重问题,如虚拟机错误VirtualMachineError
  • 自定义异常类可以继承Throwable类或者Exception类,而不要继承Error类。自定义异常类之间也可以有继承关系
  • 需要为自定义异常类设计构造方法,以方便构造自定义异常对象。
    在继承任何异常时,将自动继承Throwable类的一些标准特性,如:
  • 错误消息、栈跟踪和异常包装
/**
 * 多数情况下,创建自定义异常需要继承Exception,本例继承Exception的子类RuntimeException
 * @author Mahc
 *
 */
public class CustomerException extends RuntimeException {
 
	private String retCd ;  //异常对应的返回码
	private String msgDes;  //异常对应的描述信息
	
	public CustomerException() {
		super();
	}
 
	public CustomerException(String message) {
		super(message);
		msgDes = message;
	}
 
	public CustomerException(String retCd, String msgDes) {
		super();
		this.retCd = retCd;
		this.msgDes = msgDes;
	}
 
	public String getRetCd() {
		return retCd;
	}
 
	public String getMsgDes() {
		return msgDes;
	}
}
  1. 声明方法抛出自定义异常。为了使用自定义异常,必须通知调用代码的类:要准备处理这个异常类型。为此,声明一个或多个方法抛出异常。找到异常发生点,新建异常并加上关键字throw。
public class TestClass {
 
	public void testException() throws CustomerException {
		try {

//..some code that throws CustomerException

} catch (Exception e) { throw new CustomerException("14000001", "String[] strs's length < 4"); } } }

自定义异常

在开发中根据自己业务的异常情况来定义异常类.

自定义一个业务逻辑异常: RegisterException。一个注册异常类。

异常类如何定义:

  1. 自定义一个编译期异常: 自定义类 并继承于java.lang.Exception。
  2. 自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException。
    要求:我们模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。

首先定义一个登陆异常类RegisterException:

// 业务逻辑异常
public class RegisterException extends Exception {
    /**
     * 空参构造
     */
    public RegisterException() {
    }

    /**
     *
     * @param message 表示异常提示
     */
    public RegisterException(String message) {
        super(message);
    }
}

模拟登陆操作,使用数组模拟数据库中存储的数据,并提供当前注册账号是否存在方法用于判断。

public class Demo {
    // 模拟数据库中已存在账号
    private static String[] names = {"bill","hill","jill"};
   
    public static void main(String[] args) {     
        //调用方法
        try{
              // 可能出现异常的代码
            checkUsername("nill");
            System.out.println("注册成功");//如果没有异常就是注册成功
        }catch(RegisterException e){
            //处理异常
            e.printStackTrace();
        }
    }

    //判断当前注册账号是否存在
    //因为是编译期异常,又想调用者去处理 所以声明该异常
    public static boolean checkUsername(String uname) throws LoginException{
        for (String name : names) {
            if(name.equals(uname)){//如果名字在这里面 就抛出登陆异常
                throw new RegisterException("亲"+name+"已经被注册了!");
            }
        }
        return true;
    }
}

你可能感兴趣的:(Java自定义异常与练习)