2020/04/13学习笔记day38

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参数来确定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值