别拦我,我要撞豆腐 ----- for循环中进行异常抛出,for循环还能继续循环吗?

今天在做一个登录逻辑判断的时候,在一个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循环下去呢?

  1. 这期间我试过在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不行

  1. 然后我又尝试把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循环里面所有的成员都判断完了,再去抛异常呢?
是不是很神奇?是不是很神奇?是不是很神奇?
不谈了,我要去买豆腐了……

有时候钻不出来 就先放放 出去抽个烟 回来豁然开朗
----大佬

虽然我不抽烟,但是这个方法还是很不错的,大家千万不要学我钻死牛角尖,遇到困难想不出来了,先放一放,转移一下注意力,说不定答案就在你转身之处呢?

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值