【问题标题】:If statement not working in Android app如果语句在 Android 应用程序中不起作用
【发布时间】:2018-02-02 19:35:02
【问题描述】:

我已经尝试了我所知道的一切来解决这个问题,但我没有弄清楚。下面是将返回线程名称的类中的代码。现在,如果线程的名称与提供给此方法的名称匹配,那么它将返回该 ArrayList 的索引。问题是,布尔值是真的,但它似乎从未进入 if 语句。只是在它周围移动,而是返回 ERROR_NOTFOUND 符号。这意味着程序将忽略 if 语句的内容并继续进行第二次返回,完全绕过了第一次返回的机会。因此永远不会达到'return i;'....

我已经调试了很多次都无济于事,几乎没有答案。随意运行任意代码并自己尝试。我已将项目完全剥离到此,但仍然一无所获。然而,应用我在下面的答案是可行的。

我的想法是它与使用的关键字有关。此外,在我寻找答案的过程中,我还没有遇到任何有帮助的东西。因此,如果在某个地方有答案,请告诉我,以便我能够提高搜索技能。

    private static int searchThread(ArrayList<Thread> threads, String name) {
    int i;
    for (i = 0; i < threads.size(); i++) {
        Thread thread = threads.get(i);
        String temp = thread.getName();
        Boolean bool = temp.equals(name);
        if (bool) {
            return i;
        }
    }
    return ERROR_NOTFOUND;
}

编辑:为了进一步了解细节,我已经调试了这段代码。我也尝试清理和重建,认为这是问题所在,但都没有帮助。所以这是我的逻辑问题或缺乏理解所使用的关键字、使用的 UI 线程或其他我不知道的东西的真正影响.. 代码部分在 UI 线程上运行的任何方式都不是问题到目前为止? if 语句不被忽略,“return i”被替换为“return 1”。然后它会成功返回 1。

【问题讨论】:

  • 你怎么知道bool是真的?你调试了吗?你打印出来了吗?有threads吗?
  • 1) 您是否记录了bool 以验证它的真实性? 2) searchThread 是否在 UI 线程上运行? 3) 为什么不volatile boolean bool = temp.equals(name);
  • 如果你的线程数组为空,它不会进入循环
  • 好吧,除非有一些看不见的线程问题,否则条件真的不应该失败,并且searchThread() 的实际返回应该在方法之外是正确的。无论如何,调试器总是在跟踪方法中的多个返回路径时遇到问题:stackoverflow.com/questions/21805868。当您将其更改为单个 return 时,问题已解决。

标签: java android arraylist


【解决方案1】:

你描述的场景是不可能的。

return i

表示必须返回某个数字。

有两种可能的解释:

1)你没有检查“bool”状态,它是假的。

2)线程大小为零,所以程序不进入循环

【讨论】:

  • 我确实检查了 bool 状态,这就是为什么有一个 if 语句......并且 bool 确实变成了真的。由于其他原因,它只是被忽略了。
  • 我的意思是你没有检查调试模式下的bool状态和调试模式下的线程大小
  • 我做了检查,除了返回“i”外,一切正常。它一直跳到另一个返回。
  • 这里没有任何解释。值和变量是正确的,调试器正常工作,代码被清理和重建。尽管 bool 为真,调试器只是进入 if 语句并在下一次进入指令时跳到最后一个返回以最终提供 ERROR_NOTFOUND 而不是进入语句并返回 i。
【解决方案2】:

所以我似乎已经解决了自己的问题,但我仍然对为什么第一次尝试无法返回 'i' 感到困惑,因为在 for 循环中以及在if 语句。

无论如何,下面是用于使其工作的代码。创建一个初始化为'ERROR_NOTFOUND'的附加int变量,一旦找到线程,将其更改为'i'的变量。刚刚找到了看待问题的不同方式。

再次,如果有人能指出为什么在第一次尝试中无法返回“i”,我很想知道,因为它看起来很奇怪..

编辑:不再那么困惑了。看起来毕竟是编译器和调试器的问题。链接了解更多详情。 http://stackoverflow.com/questions/21805868

private static int searchThread(ArrayList<Thread> threads, String name) {
    int status = ERROR_NOTFOUND;
    for (int i = 0; i < threads.size(); i++) {
        Thread thread = threads.get(i);
        String temp = thread.getName();
        Boolean bool = temp.equals(name);
        if (bool) {
            status = i;
        }
    }
    return status;
}

我的 if 语句已被缩短为

if (thread.getName().equals(name)) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2013-06-20
    • 2013-09-04
    • 2014-09-10
    • 2018-02-15
    相关资源
    最近更新 更多