重置密码后通过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

