You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重置密码后通过switch case判断用户组时触发NullPointerException问题求助

重置密码后通过switch case判断用户组时触发NullPointerException问题求助

你好,看了你的问题描述和代码,密码能成功重置但切换用户组时触发空指针,确实挺让人头疼的!

先帮你定位下问题根源:报错信息Cannot invoke "String.hashCode()" because "<local3>" is null,对应你代码里第35行的switch (Utente.getGroup())——这说明**Utente.getGroup()返回了null**,而switch语句处理字符串类型的条件时,底层会调用hashCode()方法,null对象自然会触发这个空指针异常。

为什么会出现这种情况?

密码重置成功不代表用户的组信息会自动同步到你的Utente对象里。大概率是你在调用Utente.ReimpostaPasswordPrimoAccesso(newPassword)之后,没有重新从Cognito拉取当前用户的最新信息(包括所属用户组),导致Utente类里存储用户组的字段还是null状态。

给你几个具体的解决方案:

1. 先加null检查,避免空指针崩溃

在switch之前先判断用户组是否为空,提前处理异常情况:

public void onBtnConfermaNuovaPasswordClicked(String oldPassword, String newPassword) {
    try {
        if (verificaPasswordUguali(oldPassword, newPassword)) {
            Utente.ReimpostaPasswordPrimoAccesso(newPassword);
            
            // 新增:先获取用户组并做null检查
            String userGroup = Utente.getGroup();
            if (userGroup == null) {
                Alert alert = new Alert(Alert.AlertType.ERROR);
                alert.setTitle("用户信息获取失败");
                alert.setHeaderText("无法获取当前用户的所属组,请重新登录后尝试");
                alert.showAndWait();
                // 这里可以跳回登录页面,或者触发用户信息刷新逻辑
                return;
            }

            switch (userGroup) {
                // 你的各个case代码
            }
        } else {
            // 原有的密码不匹配提示逻辑
        }
    } catch(IOException e) {
        throw new RuntimeException(e);
    } catch (CognitoIdentityProviderException e) {
        // 原有的Cognito异常提示逻辑
    }
}

2. 重置密码后主动刷新用户组信息

你需要在密码重置成功后,主动从Cognito获取当前用户的所属组,并更新Utente对象里的对应字段。比如给Utente类新增一个刷新用户组的方法:

// 在Utente类中新增方法
public static void aggiornaGruppoUtente() {
    // 这里调用Cognito的API,获取当前已认证用户的所属组
    // 示例逻辑(根据你的Cognito集成方式调整):
    CognitoUser cognitoUser = CognitoUserPool.getDefaultUserPool().getCurrentUser();
    cognitoUser.getSessionInBackground(new AuthenticationHandler() {
        @Override
        public void onSuccess(CognitoUserSession userSession, CognitoDevice newDevice) {
            // 获取用户组信息
            List<CognitoUserGroup> groups = cognitoUser.getGroups();
            if (!groups.isEmpty()) {
                // 假设用户只属于一个组,取第一个即可
                group = groups.get(0).getName();
            }
        }

        @Override
        public void onFailure(Exception exception) {
            // 处理获取会话失败的情况
        }
    });
}

然后在密码重置后调用这个方法:

Utente.ReimpostaPasswordPrimoAccesso(newPassword);
Utente.aggiornaGruppoUtente();
// 注意:如果是异步调用,需要等待刷新完成再执行switch逻辑,可能需要用回调或者CompletableFuture处理

3. 检查Utente类的getGroup()实现

确认Utente类中的group字段是否在用户登录/密码重置后被正确赋值。比如是否在用户首次登录时就获取了组信息,还是只有在特定场景下才会更新?如果之前的逻辑只在首次登录时获取组,重置密码后没有更新,就会导致getGroup()返回null。

调试小技巧

你可以在switch之前加一行打印,确认用户组的值:

System.out.println("当前用户组:" + Utente.getGroup());

运行后看控制台输出,就能明确是不是真的为null,帮助你进一步定位问题。

备注:内容来源于stack exchange,提问作者TrySoHard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 12:14:51