【问题标题】:Program does not enter if statement [closed]程序不进入if语句[关闭]
【发布时间】:2015-05-29 21:24:48
【问题描述】:

所以我有一个错误检测程序,如果当前单词(String cWrd)不包含在静态数组(作为参数传递)中,它应该检测“错误”。如果在数组中未找到该单词,则“找到的布尔值”保持为假,并且在一段时间内将 JLabel 设置为“错误类别”。 但是,即使 cWrd 不包含在数组中,该方法似乎也不会执行。

代码:

//Mistake method
public void mistake(String[] arr) {
    int i = 0;
    boolean found = false;
    while (i < arr.length && found == false) {
        if (arr[i].equals(cWrd)) {
            found = true;
        }
        i++;
    }
    if (found == false) //The program never enters this if statement
    {
        lmid.setText("Wrong Category!");
        try {
            t1.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

编辑: 这是我正在测试的两个数组

String[] positive =
{"Happy","Beautiful","Wonderful","Generous","Loving","Supportive","Caring"};
String[] negative =  {"Nasty","Gross","Horrible","Obnoxious","Mean","Disaster","Angry"}; 

这是将 cWrd = 设置为来自正负数组组合的随机单词的方法(ArrayList 未图示)

public void wordGen()
   {
      wchooser = rand.nextInt(words.length);
      lmid.setText("            " + words[wchooser]);
      cWrd = lmid.getText();
   }

【问题讨论】:

  • if (found = false)更改为if (found == false)
  • 只需使用if (found)while (!found)if (found == true)...while (found == false),这是多余的。
  • 最好还是改成if(!found)
  • 顺便说一句:t1.sleep(100); 不会在 t1 线程上休眠,而是在当前线程上休眠。这是为什么我们应该避免从引用而不是类调用静态方法的标准示例之一。简单来说t1.sleep(100);Thread.sleep(100);是一样的。
  • 我不确定您所说的 当前线程 是什么意思,因为Thread.sleep 会影响将执行此代码的线程(即当前线程)。如果你想暂停 other thread 那么你可能应该使用某种 volatile signal ,它将在那个线程中被检查。

标签: java arrays user-interface if-statement


【解决方案1】:

尽管像found == falsenot found = false)这样的测试是有效的,但如果将其更改为等效的!found,代码将更具可读性且不易出错。

我修改了您的程序以进行输出而不是休眠以使结果更明显,这是缩小错误范围时应该做的事情,在我看来它正在工作。无论是否找到字符串,它都会到达 if 语句并通过它采取正确的路径。

public class Test {
  public static void main(String[] args) {
    Test t = new Test();
    t.mistake(new String[] { "aaa", "bbb" });
    t.mistake(new String[] { "xyzzy", "aaa", "bbb" });
  }

  String cWrd = "xyzzy";

  public void mistake(String[] arr) {
    int i = 0;
    boolean found = false;
    while (i < arr.length && !found) {
      if (arr[i].equals(cWrd)) {
        found = true;
      }
      i++;
    }
    if (!found) // The program never enters this if statement
    {
      System.out.println("Wrong Category!");
    } else {
      System.out.println("Found!");
    }
  }
}

输出:

Wrong Category!
Found!

【讨论】:

  • 我把它改成了if(!found),结果一样。
  • @imgolden62 结果如何?你期待什么,发生了什么?
【解决方案2】:

您使用的是赋值运算符而不是比较运算符。

这个:

if (found = false)   

应该是:

if (found == false)   

否则if (found = false) 将始终评估为false 并且永远不会进入循环。

如果更改运算符不起作用,那么我们只能假设正在找到 cWrd 的值并将 found 变量设置为 true,这就是语句不执行的原因。

就我个人而言,我会设置调试器并单步执行代码并弄清楚代码在做什么。

【讨论】:

  • 他为什么要把它变成“cwrd”?他可以有一个全局变量。如果他不这样做,它就不会为他编译
  • @BrandonLing 考虑到它从未定义或声明,我假设他正在寻找字符串文字。
  • cwrd 是一个全局变量。我不明白为什么它需要是 cWrd。
  • @BlackHatSamurai 但就像我说的那样,他的代码无法编译,而且他不会抱怨他的 if 语句没有达到
  • @imgolden62 如果它是一个全局变量,我会包含所有相关代码,例如您搜索的数组的值是什么以及 cWrd 的值是什么。
【解决方案3】:

根据您的情况将 = 更改为 ==。

【讨论】:

  • 好的,我已经做到了,但它仍然没有按预期执行
  • = vs == 看起来像是印刷错误,这在 Stack Overflow 上是题外话。如果您认为这只是问题,那么您应该投票结束这个问题,而不是发布答案。您可以通过发布有关此问题的评论来帮助 OP,但不要阻止此类问题通过在此处进行投票来自动删除。 (此评论适用于此处的所有答案)
【解决方案4】:

纠正这个:

    if (found == false)     //The program never enters this if statement
    {
    lmid.setText("Wrong Category!");
    try {
        t1.sleep(100);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

【讨论】:

  • 我并不是说你的答案是错误的,但你能解释一下它与其他已经发布的有什么不同吗?一般来说,如果您同意其他答案并且您的答案没有添加任何新内容而不是发布它,您应该投票赞成您同意的现有答案。
猜你喜欢
  • 2011-11-27
  • 2013-04-01
  • 1970-01-01
  • 2017-09-05
  • 2014-05-05
  • 2015-03-29
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多