今天在做一个登录逻辑判断的时候,在一个for循环里,抛出了一个自定义异常,然后for循环就直接被跳出了……???这是我没想到的地方,我忍不了,死活就要让for循环继续执行下去。于是再我死钻牛角尖两个多小时以后,得出了一个很不想接受的结论:在for循环里面抛自定义异常,for循环一定会结束。
下面是牛角尖代码:
//userArrayList是一个存放所有用户信息的集合
//这里遍历集合,拿出每一个用户进行id(账号)和pwd(密码)的比较
for (User users : userArrayList) {
if (id.equals(users.getId()) &&
pwd.equals(users.getPassword())) {
return users; //如果id和pwd都匹配,就直接返回users
} else {
//如果不匹配,就抛出自定义异常
throw new IdPwdFalseException("ID或密码错误!");
}
}
就这,要是不仔细看,还真以为就对了。那要是真以为对了,那可就大错特错了……(好绕)
仔细观察,不难发现,整个循环,只运行了一次,for只判断了集合中的第一个用户信息,如果id或密码不正确,就直接抛异常,跳出for循环了。然后我这个死脑筋啊,就一直在想怎么能抛了异常以后还能再for循环下去呢?
- 这期间我试过在for里面再写一个try…catch
//以下是错误代码,仅作展示啊!!!
for (User users : userArrayList) {
try {
if (id.equals(users.getId()) &&
pwd.equals(users.getPassword())) {
return users;
} else {
throw new IdPwdFalseException("ID或密码错误!");
}
} catch (IdPwdFalseException e) {
e.getMessage();
}
}
得出:try…catch不行
- 然后我又尝试把for循环写成一个方法,使用递归去调用这个方法,看看能不能把for循环走完
//以下还是错误代码,仅作展示
//主方法里面的for
for (User user : userArrayList) {
return forList(id, pwd, userArrayList);
}
//这是单独写的用来递归调用的方法
public User forList(String id, String pwd, ArrayList<User> userArrayList) {
for (User users : userArrayList) {
if (id.equals(users.getId()) &&
pwd.equals(users.getPassword())) {
return users;
} else {
throw new IdPwdFalseException("ID或密码错误!");
}
}
}
//好吧我摊牌了,递归我没写出来,只是傻脑壳头有这么个想法……
得出:递归也不行
然后我又想到可不可以用for循环遍历出来的每一个用户,都获取他们的账号和密码,然后存到一个map集合中,再使用键值对的方式来判断键和值是否对应相等,听起来能实现
//以下依然是错误代码,仅作展示
//定义一个map集合
HashMap<String, String> map = new HashMap<>();
for (User users : userArrayList) {
//获取每一个用户的账号和密码,并存入map集合中
String userId = users.getId();
String userPwd = users.getPassword();
map.put(userId, userPwd);
//遍历map集合
Set<String> keySet = map.keySet();
for (String key : keySet) {
String value = map.get(key);
//判断是否相等
if (id.equals(key) && pwd.equals(value)) {
return users;
} else {
throw new IdPwdFalseException("ID或密码错误!");
}
}
}
害……还是不行……
我整个人都陷入了这个for循环和异常的矛盾当中……不可自拔。。。拔萝卜都拔不出来那种。
后来,我抱着我这个还没有钻傻牛角尖的脑壳壳,去询问了大佬,怎么解决。。。然后,看到解决方案的那一刻,我特别想找一块豆腐撞死自己,哦不,是十块豆腐,撞死自己…………
//这是正确代码,可以参考
for (User users : userArrayList) {
if (id.equals(users.getId()) &&
pwd.equals(users.getPassword())) {
return users;
}
}
throw new IdPwdFalseException("ID或密码错误!");
大佬默默的把我的异常,从for循环里,dia了出来,然后一脸阳光的看着我:想不想打人?
我当时的内心OS:?????????????????????????
出现这种钻牛角尖的问题,是在哪个地方呢?没错,就是一股脑的光想着怎么保证抛出异常的同时,for循环不结束。而实际上应该考虑的是,为什么不是先把for循环里面所有的成员都判断完了,再去抛异常呢?
是不是很神奇?是不是很神奇?是不是很神奇?
不谈了,我要去买豆腐了……
有时候钻不出来 就先放放 出去抽个烟 回来豁然开朗
----大佬
虽然我不抽烟,但是这个方法还是很不错的,大家千万不要学我钻死牛角尖,遇到困难想不出来了,先放一放,转移一下注意力,说不定答案就在你转身之处呢?