Java第二阶段---15异常---第三节 自定义异常
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;
}
@Override
public void eat() throws UsernameNotFindException {
}
//父类中的方法没有声明抛出异常,子类中方法可以声明抛出运行时异常
@Override
public void sleep() throws RuntimeException{
}
//父类中的方法没有声明抛出异常,子类中方法不能声明抛出检查异常
@Override
public void login() {
try{
Login.login(username,password);
} catch (BadCredentialsException e) {
e.printStackTrace();
} catch (UsernameNotFindException e) {
e.printStackTrace();
}
}
}