【问题标题】:Java: Why does the compiler complain here?Java:为什么编译器会在这里抱怨?
【发布时间】:2016-04-22 15:29:23
【问题描述】:
  0          int specialFuncStart;
  1          String[] specialFunctions= {"sum","ddx","integral"};
  2          for(String element: specialFunctions){
  3              specialFuncStart = finalMath.lastIndexOf("sum");
  4          }
  5          while (specialFuncStart != -1) {   code  }

为什么line 5specialFuncStart 可能尚未初始化?字符串是最终的且固定的,因此 for 循环将始终运行。编译器不知道还是我错过了什么?我明白初始化specialFuncStart = -1;是怎么解决的,但是为什么呢?

【问题讨论】:

  • 变量specialFuncStar在哪里声明?
  • 在该声明中添加一个 =0。由于您的变量仅在 for 循环范围内初始化,编译器认为 for 循环可能并不总是运行,并且变量可能并不总是被初始化。

标签: java for-loop while-loop compiler-errors compiler-warnings


【解决方案1】:

在 while 循环中,您使用在另一个循环范围内初始化的变量检查条件。编译器不会让你这样做,因为考虑到它可能没有正确初始化、循环可能不会运行或它可能会提前中断,即使从我们的角度来看事件将完美发生也是如此。 问题在于作用域,Java 是一种健壮且强类型的语言,它的编译器会检查所有可能性以防止意外发生。

【讨论】:

    【解决方案2】:

    编译器显示错误,因为您在 for 循环中初始化了 specialFuncStart 变量,并且编译器不确定它是否执行,因为 在 for-each 循环中,数组大小可以为 0,这使得它无法执行。

    所以你在 for 循环之前初始化它以防止错误

    specialFuncStart = 0;

    【讨论】:

      【解决方案3】:

      声明了它,但你没有初始化它。您需要为其设置一个值:

      int specialFuncStart; // declare
      specialFuncStart = 0; // initialize
      
      int specialFuncStart = 0; // both
      

      您的编译器认为有时specialFuncStart 不会被初始化,因为for 循环不必必须执行。

      【讨论】:

      • 即使代码明确表示 for 循环会运行?为什么要这样做?
      • @JohanZ。是的。不幸的是,编译器还没有那么聪明。它在编译时不会注意到这一点。尝试删除“for”循环,看看错误是否会被删除。
      • 这与编译器的智能无关。编译器可以很容易地看到循环始终在运行。只是编译器有点懒惰,而不是检查每个案例,它只是说“初始化你的变量”是安全的。
      • @Kayaman 你是对的。无论如何,我认为这更像是一个效率问题
      • 差不多。强制初始化变量比向编译器编写额外的逻辑要容易得多。
      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 2012-09-12
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 2011-01-14
      相关资源
      最近更新 更多