1. 为什么要使用自定义异常
在Java中,异常的类型非常的多,要想使用这些异常,首先必须要熟悉它们。这无疑是一个巨大的工作量,很耗费时间。如果我们可以自定异常,则只需要熟悉 RuntimeException 、 Exception 和 Throwable 即可。这大大缩小了熟悉范围。自定义异常还可以帮助我们快速的定位问题。
自定义运行时异常语法
public class 类名 extends RuntimeException{}
自定义检查异常语法
public class 类名 extends Exception{}
示例
在登录时经常会看到提示:"用户名不存在"或者"账号或密码错误"。请使用自定义异常来描述该场景
package com.cyx.exception;/*** 用户名不存在** 异常命名规范:场景描述+Exception*/
public class UsernameNotFindException extends Exception{public UsernameNotFindException(){}public UsernameNotFindException(String msg){super(msg);}}package com.cyx.exception;public class BadCredentialsException extends Exception{public BadCredentialsException(){}public BadCredentialsException(String msg){super(msg);}
}package com.cyx.exception;import java.util.Scanner;public class Login {private static Scanner sc = new Scanner(System.in);public static void main(String[] args){System.out.println("请输入账号:");String username = sc.next();System.out.println("请输入密码:");String password = sc.next();try{login(username,password);}catch(UsernameNotFindException e){e.printStackTrace();}catch (BadCredentialsException e) {e.printStackTrace();}}public static void login(String username,String password) throws BadCredentialsException, UsernameNotFindException {if("admin".equals(username)){if("123456".equals(password)){System.out.println("登录成功");}else {throw new BadCredentialsException("账号或密码错误");}}else{throw new UsernameNotFindException("账号不存在");}}}
2.异常使用注意事项
a.运行时异常可以不处理。
b.如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是该异常的子集。(与协变返回类型原理一致)
c.父类方法没有抛出异常,子类覆盖父类该方法时也不可能检查异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
package com.cyx.exception;public class Father {public void eat() throws Exception{}public void sleep(){}public void login(){}}package com.cyx.exception;public class Child extends Father{private String username;private String password;public Child(String username, String password) {this.username = username;this.password = password;}@Overridepublic void eat() throws UsernameNotFindException {}//父类中的方法没有声明抛出异常,子类中方法可以声明抛出运行时异常@Overridepublic void sleep() throws RuntimeException{}//父类中的方法没有声明抛出异常,子类中方法不能声明抛出检查异常@Overridepublic void login() {try{Login.login(username,password);} catch (BadCredentialsException e) {e.printStackTrace();} catch (UsernameNotFindException e) {e.printStackTrace();}}
}