活动地址:CSDN21天学习挑战赛
目录
一、自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分通用的异常情况,但是,在实际程序编写中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚我们想要表达的个性化问题,此时可以创建自己的异常类,即自定义异常类。
1.1 自定义异常的步骤
1)创建一个继承 Exception 或 RuntimeException的子类
形式如下:
class 自定义异常类名 extends Exception{
类体;
}
2)使用异常
若 某一个方法(函数) 的方法体将产生异常,则应在 该方法 声明时,通过 throw关键字抛出该自定义异常对象,该方法 的声明形式如下:
[函数返回值类型] 方法 ([参数列表]) throws 自定义异常类名 {
方法体;
}
若 该方法 要抛出多个异常,可以声明多个异常类,并用逗号隔开。
1.2 以用户登录时密码输入多次为例自定义异常
示例要求:①用户登录程序:用户输入用户名后有3次输入密码的机会,输入正确显示欢迎信息;输入q表示用户主动结束登陆,输出再见信息;
②如3次输入密码错误,则产生异常,捕获此异常,输出账户锁定信息。
//自定义异常类TooManyTimesWrongLogin,表示用户登录错误的次数过多
package Exception;
import java.util.*;
public class Exception_05{
public static void main(String[] args) { //主函数
User user;
String userName;
@SuppressWarnings("resource") //@SuppressWarnings : 选择性地取消特定代码段(类或方法)中的警告。
Scanner reader = new Scanner(System.in);
System.out.println("请输入用户名:");
userName = reader.next();try {
user = check(userName); //用户名及密码的验证函数:可能存在异常(密码输入超过三次)
}catch(TooManyTimesWrongLogin e) {
System.out.println("对不起,您的账户已被锁定,请联系...");
return;
}catch(Exception e) {
System.out.println(e);
return;
}
if(user.loginSuccess)
System.out.println(user.userName+"欢迎你!");
else
System.out.println(user.userName+"再见!");}
//定义产生异常的方法:定义的某一个类(Exception_05)中的 某一个方法(check)可能产生某个类型(TooManyTimesWrongLogin)的异常,声明时用throw语句
public static User check(String userName) throws TooManyTimesWrongLogin{
String password;
@SuppressWarnings("resource")
Scanner reader = new Scanner(System.in);for (int i=0;i<3;i++) {
System.out.println("请输入密码,您还有"+(3-i)+"次机会,输入Q或q表示取消登录。");
password = reader.next();
if(userName.equals("User")&&password.equals("123456")) //只有在输入为“User”,输入密码为“123456”时,验证通过
return new User(userName,true);
else if(password.equalsIgnoreCase("Q"))
return new User(userName,false);
}
//这里设置:如果三次登陆均没有成功,并且没有退出,就输出该用户的ip地址
throw new TooManyTimesWrongLogin(userName,"10.10.10.25");
}
}
class TooManyTimesWrongLogin extends Exception{
//自定义异常类,继承Exception类
String userName;
String IPAdress;
TooManyTimesWrongLogin(String userName,String IPAdress){
this.userName = userName;
this.IPAdress = IPAdress;
}
}
class User{
String userName;
boolean loginSuccess;
User(String userName,boolean loginSuccess){
this.userName = userName;
this.loginSuccess = loginSuccess;
}
}
运行结果如下:
二、异常处理的注意事项
由于异常的调用会占据较大内存,应尽量减少异常的使用:
1)如果使用简单的编程可以完成检查的操作,尽量不用异常去替代。
如:输入密码错误三次则退出程序,编程是可以实现的:将“throw new TooManyTimesWrongLogin(userName,"10.10.10.25");”抛出异常的代码换成“ System.exit(0); ”等退出操作。
2)最好不要到处使用异常,更不要在循环体中使用
3)不要捕获了一个异常却又不对它做任何处理
4)通常将异常交给方法的调用者去处理