java-day38
自定义异常
在我们所开发的系统中,常常需要自己定义一些异常类型,用这种异常类型来代表系统中独有的异常情况。
例如:
用户输入的用户名和密码 与数据库中的信息不匹配。
用户输入的验证码和后台自动产生并且保存起来的值不对应。
用户操作一个功能,但是用户的权限不满足。
如果自定义异常是运行时异常,那么就需要让自定义异常类继承RuntimeException
如果自定义异常是编译时异常,那么就需要让自定义异常类继承Exception
实现步骤
步骤一:自定义异常类继承RuntimeException 或者 Exception
步骤二:自定义异常类中的构造器需要和父类型保存一致(可选)
步骤三:自定义异常类中添加一些额外需要携带的信息,例如错误码(可选)
自定义异常例子:
public class UserNameOrPasswordException extends Exception{
private static final long serialVersionUID = -908196028593934122L;
private int errorCode;
public UserNameOrPasswordException() {
super();
}
public UserNameOrPasswordException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public UserNameOrPasswordException(String message, Throwable cause) {
super(message, cause);
}
public UserNameOrPasswordException(String message) {
super(message);
}
public UserNameOrPasswordException(int errorCode,String message) {
super(message);
this.errorCode = errorCode;
}
public UserNameOrPasswordException(Throwable cause) {
super(cause);
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
}
public abstract class ErrorCodeConstants {
public static final int USERUSER_PASSWORD_ERROR = 10001;
}
public class ExceptionTest1 {
private Map<Long,User> db;
{
db = new HashMap<>();
db.put(1L, new User(1L,"tom1","123",21));
db.put(2L, new User(2L,"tom2","123",22));
db.put(3L, new User(3L,"tom3","123",23));
db.put(4L, new User(4L,"tom4","123",24));
db.put(5L, new User(5L,"tom5","123",25));
}
public static void main(String[] args) {
ExceptionTest1 t = new ExceptionTest1();
String username = "tom1";
String password = "123";
User user = null;
String msg = null;
try {
user = t.login(username, password);
msg = "登录成功("+user+")";
} catch (UserNameOrPasswordException e) {
//e.printStackTrace();
msg = "登录失败("+e.getErrorCode()+"-"+e.getMessage()+")";
}
System.out.println("登录状态:"+msg);
}
public User login(String username,String password) throws UserNameOrPasswordException {
User loginUser = null;
for(User u : db.values()) {
if(u.getUsername().equals(username) && u.getPassword().equals(password)) {
loginUser = u;
break;
}
}
if(loginUser == null) {
throw new UserNameOrPasswordException(ErrorCodeConstants.USERUSER_PASSWORD_ERROR,"用户名或密码错误");
}
return loginUser;
}
@SuppressWarnings("unused")
private class User{
private long id;
private String username;
private String password;
private int age;
public User() {}
public User(long id, String username, String password, int age) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", age=" + age + "]";
}
}
}
断言 assert
JDK1.4,引入的一个新的关键字:assert
使用方式:
//不指定错误信息
assert 布尔表达式
//指定错误信息
assert 布尔表达式: 错误信息
根据条件(布尔表达式)的结果来进行判断,如果返回false,则会自动抛出AssertionError的错误。通过assert断言来判断的表达式,返回值一定要是true,否则就抛出Error。
assert是java中一个关键字,它是要JVM支持才能起作用的,默认情况下,JVM中的断言是关闭的,如果想让断言功能生效,需要给VM传参
// java -enableassertions com.zzb.day38.test.Hello
可以简写:
// java -ea com.zzb.day38.test.Hello
例如:
public static void main(String[] args) {
AssertTest t = new AssertTest();
t.test(0);
}
public void test(int a) {
assert a!=0 : "参数必须不能为0";
int x = 100/a;
System.out.println(x);
}
总结:
关键assert可以在系统的关键关键对数据做验证,如果验证不满足,断言会自动抛出Error信息,同时我们还可以指定Error信息的内容。并且最关键的时候,这个assert关键字是否生效,可以通过在运行代码的时候,传VM参数来确定。