首页 > 解决方案 > 查找第二次出现的子字符串的 Java 方法中的“错误:找不到符号”

问题描述

我正在编写一个方法来查找数组中第二次出现的子字符串的索引。它发现第一次出现的索引很好。

接下来,我尝试创建从first索引开始的循环,但它不起作用。second它说关于我的变量的“错误:找不到符号” 。

请给我任何建议如何改进我的代码或使用此方法的其他实现...</p>

int findSecond(String[] strArray, String str) {
  for (int i = 0; i < strArray.length; i += 1) {
      if (i > 1) {
        int first = Arrays.asList(strArray).indexOf(str);
        // int second = Arrays.asList(strArray).indexOf(str, first + 1);
        for (int e = first; e < strArray.length; e += 1) {
          int second = Arrays.asList(strArray).indexOf(str);
        }


        return second;
      }
   }
   return -1;
}

标签: javascopecannot-find-symbol

解决方案


你的问题的原因是变量“范围”的Java概念,特别是“块范围”。定义变量时,它只存在于定义它的块 ( { }) 中。在块之后运行的代码中,该变量已被丢弃,不能再使用。Java 这样做既是为了减少程序使用的内存,也是为了使代码更易于理解——在阅读代码时,您知道您不必考虑不再在范围内的变量。

块范围会导致您在这部分代码中出现问题:

        for (int e = first; e < strArray.length; e += 1) {
          int second = Arrays.asList(strArray).indexOf(str);
        }

        return second;

你的second变量不存在就行return second。之前的int second变量声明只对声明所在的块有效——for循环块。

要解决此问题,您必须在使用它的最外层范围内声明该变量。尽管您的代码在循环运行之前无法知道second变量应该具有什么值for,但您仍然可以在不分配值的情况下声明变量,然后在后面的行中分配值:

        int second;
        for (int e = first; e < strArray.length; e += 1) {
          second = Arrays.asList(strArray).indexOf(str);
        }

        return second;

推荐阅读