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