从布尔方法捕获和重新抛出异常会返回false,而不执行任何操作会导致方法不返回

时间:2014-05-12 14:14:35

标签: java exception

我有一个关于java编程语言的常规查询,以及它如何处理返回布尔值的异常和方法。

请注意,尽管以下示例涉及Spring / Ldap / ActiveDirectory,但我的问题仅涉及 java 例外

public boolean doAuthenticate(String userAndDomain, String password) {
        UsernamePasswordAuthenticationToken userToken = new UsernamePasswordAuthenticationToken(replaceBackSlashWithAtSign(userAndDomain), password);
        try {
            Authentication authentication = adAuthenticationProvider.authenticate(userToken);
            return authentication.isAuthenticated();
        } catch (BadCredentialsException e) {
            log.error("Authentication failed - wrong username\\password", e);
            throw new BadCredentialsException("Authentication failed - wrong username\\password", e);
        } catch (AuthenticationException e) {
            log.error("Authentication failed - AuthenticationException", e);
            throw new AuthenticationException("Authentication failed - AuthenticationException", e) { };
        }
    }

如果身份验证方法重新引发BadCredentialsExceptionAuthenticationException中的任何一个,那么doAuthenticate方法将返回false

但是如果出于某种原因<{>> adAuthenticationProvider.authenticate()引发了另一个运行时异常,则该方法不会返回false,并且根本不会返回 ...

我很想知道为什么......

修改

 LdapAuthentifier authentifier = new LdapAuthentifierImpl();
 boolean didAuthenticate = authentifier.doAuthenticate(VALID_USER, INVALID_PASSWORD);

System.out.println {strong}的didAuthenticate确实显示错误如果抛出了两个指定的异常中的一个,而另一个异常停止了程序的执行,而System.out.println则是从未到过......

编辑2

public static void main(String[] args) {
 LdapAuthentifier authentifier = new LdapAuthentifierImpl();
 boolean didAuthenticate = authentifier.doAuthenticate(VALID_USER, INVALID_PASSWORD);
}

1 个答案:

答案 0 :(得分:0)

我明白发生了什么。这是解释。

我在日志中实际看到的异常是BadCredentialsException,但adAuthenticationProvider.authenticate永远不会抛出异常,因此以下方法永远不会重新抛出

实际发生的是authentication.isAuthenticated()只是返回false而我将此布尔值传递给客户端代码。

为了清楚起见,我再次提出这个方法:

 @Override
    public boolean doAuthenticate(String userAndDomain, String password) {
        UsernamePasswordAuthenticationToken userToken = new UsernamePasswordAuthenticationToken(replaceBackSlashWithAtSign(userAndDomain), password);
        try {
            Authentication authentication = adAuthenticationProvider.authenticate(userToken);
            return authentication.isAuthenticated();
        } catch (BadCredentialsException e) {
            log.error("Authentication failed - wrong username\\password", e);
            throw new BadCredentialsException("Authentication failed - wrong username\\password", e);
        } catch (AuthenticationException e) {
            log.error("Authentication failed - AuthenticationException", e);
            throw new AuthenticationException("Authentication failed - AuthenticationException", e) { };
        }
    }