Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 函数总是返回false,即使缓冲区是真值?_Java_List_Boolean - Fatal编程技术网

Java 函数总是返回false,即使缓冲区是真值?

Java 函数总是返回false,即使缓冲区是真值?,java,list,boolean,Java,List,Boolean,为什么即使缓冲区为true,函数也总是返回false, 代码如下: public class getCredentials { User login = new User(); public boolean akses(String id, String password){ boolean buffer=false; for (int i=0;i<login.sizeArrayList();i++){ buffe

为什么即使缓冲区为true,函数也总是返回false, 代码如下:


public class getCredentials {
    User login = new User();

    public boolean akses(String id, String password){
        boolean buffer=false;
        for (int i=0;i<login.sizeArrayList();i++){
            buffer = login.getId(i).equals(id) && login.getPassword(i).equals(password);
        }
        return buffer;
    }
} 

公共类getCredentials{
用户登录=新用户();
公共布尔akses(字符串id、字符串密码){
布尔缓冲区=假;

对于(int i=0;i您对akses方法的逻辑有疑问

如果列表为空,该方法可以返回false,因为返回的是初始化值

但也将返回true当且仅当列表中最后一个用户的id和密码正确时

您不需要迭代整个列表来实际验证用户\

hpw将修复它

使用Java8,您可以对列表进行流式处理,然后使用凭据进行过滤,然后

  • 检查列表是否为空
  • 查找any,如果未找到,则返回null

  • 例如:

      public boolean access(String id, String password){
          User x = login.getArrayList().stream()
              .filter(p -> login.validateId(id) &&    
              login.validatePassword(password))
              .findAny().orElse(null);
            return x != null;
        }
    

    您可以像这样更新
    akses
    方法:

    public boolean akses(String id, String password){
       boolean buffer=false;
       for (int i=0;i<login.sizeArrayList() && !buffer;i++){
          buffer = login.getId(i).equals(id) && login.getPassword(i).equals(password);
       }
       return buffer;
    }
    
    public boolean akses(字符串id、字符串密码){
    布尔缓冲区=假;
    
    对于(inti=0;i,正如前面的答案所说:假设您有三个用户,第二个用户就是您正在搜索的用户

    循环之前的初始化将“buffer”设置为false。 循环的第一次迭代将“buffer”设置为false。 第二次迭代将“buffer”设置为true。 第三次迭代将“buffer”设置为false

    然后,将返回“buffer”的当前值(即“false”)

    正确的代码位如下所示:

    public class getCredentials {
        User login = new User();
    
        public boolean akses(String id, String password){
            for (int i=0;i<login.sizeArrayList();i++){
                if(login.getId(i).equals(id) && login.getPassword(i).equals(password)) return true;
            }
            return false;
        }
    } 
    
    公共类getCredentials{
    用户登录=新用户();
    公共布尔akses(字符串id、字符串密码){
    
    对于(int i=0;i,该方法返回列表最后一个条目的测试。这是故意的吗?我假设不是。也许您喜欢编写类似

    buffer |=
    

    如果这是您想要的,那么在第一次匹配时立即返回true就足够了。

    您确定此sizeArrayList不是空的吗???…发布您的。这是一个开始使用调试器的好机会。使用调试器,您可以在代码执行时逐行检查代码,观察运行时行为并更改您的值r变量。当您这样做时,具体会发生什么?循环是否迭代?在循环的每次迭代中,
    buffer
    设置为什么?更具体地说,在循环的最后一次迭代中,它设置为什么,因为这是您返回的值?您是否打算在找到单个匹配项后返回?具有非标准的结束条件for循环中的ia是一种糟糕的样式,这使得代码更难阅读和理解。谢谢你的评论!我不知道它不是标准的。只是要明确一点,在for循环中做什么没有“官方”标准,但通常的两种设计模式是“从0到I计数”和“for(迭代器.begin();迭代器.next();)”或者类似的,如果你在循环头中插入任何比这更复杂的东西,它很容易被其他编码人员忽略。因此,最好避免它,并在循环体本身中添加额外的退出条件,这会使代码更清晰。应该是对id和密码的验证…为了安全起见,我是最后一个循环的int代码的作用是假设存在一个验证id和passw的方法