【问题标题】:For Loop - variable not recognized; "not a statement" errorFor Loop - 变量无法识别; “不是声明”错误
【发布时间】:2013-02-24 17:09:31
【问题描述】:

我已经很多年没有用 Java 编码了,但最近我被要求在工作中实现一个基于 Java 的程序。长话短说,它完成了我们需要的一切,除了将用户 ID 而不是电话号码放在报告中。我应该指出,我们是拥有该程序的公司的合作伙伴,我有权根据需要进行更改。但是,他们的网站不提供源代码。我已经要求了,但 3 周后没有运气。所以,我必须反编译代码,并进行所需的更改。我已经设法进行了更改,并删除了除三个之外的所有编译错误。它们在三个不同的 For 循环中都是相同的错误。当我尝试顶级编译时,我得到以下信息。

FraudDetectionTool.java:655: not a statement
        for ( str3 : arrayOfString2 ) {
              ^
FraudDetectionTool.java:655: ';' expected
        for ( str3 : arrayOfString2 ) {
                  ^
FraudDetectionTool.java:655: illegal start of expression
        for ( str3 : arrayOfString2 ) {
                   ^
FraudDetectionTool.java:655: ';' expected
        for ( str3 : arrayOfString2 ) {
                    ^
FraudDetectionTool.java:681: not a statement
      for (str3 : array3) {
           ^
FraudDetectionTool.java:681: ';' expected
      for (str3 : array3) {
               ^
FraudDetectionTool.java:681: illegal start of expression
      for (str3 : array3) {
                ^
FraudDetectionTool.java:681: ';' expected
      for (str3 : array3) {
                 ^
FraudDetectionTool.java:695: not a statement
      for (str3 : arrayOfString3) {
           ^
FraudDetectionTool.java:695: ';' expected
      for (str3 : arrayOfString3) {
               ^
FraudDetectionTool.java:695: illegal start of expression
      for (str3 : arrayOfString3) {
                ^
FraudDetectionTool.java:695: ';' expected
      for (str3 : arrayOfString3) {

这是包含第一个 for 循环的代码部分。我省略了 Main 的剩余部分。如果需要,我可以发布整个课程(750 行)或方法(160 行)。我注意到的是 str3 已初始化,但在 For 循环内无法识别。但是,如果我保留原始初始化,并尝试在 For 循环内重新初始化。我的编译器警告我该变量已在 Method Main 中使用。

public static void main(String[] paramArrayOfString)
{
 initializeProperties();
 init();

 GenericInputChannel.initialize(true);

 for (String str1 : paramArrayOfString) {
  fileNames.add(str1);
 }

 try
 {
   String[] mail = EMAIL_ADDRS.split(",");
   for (String str2 : mail) {
     str2 = str2.replaceAll(" *", "");
     emailAddresses.add(str2);
     if (str2.length() > 0) {
      if (DEBUG) {
            System.out.println("Adding email " + str2);
      }
      sendEmail = true;
    }
  }
 } 
 catch (Exception localException1) {
   System.out.println("Error parsing email addrs " + EMAIL_ADDRS);
   emailAddresses.clear();
 }

 if (TEST_MODE) {
  System.out.println("Sending Test email");
  sendEmail(true);
  System.exit(0);
 }

 String[] arrayOfString2 = new String[1];
 String str3;

 if (fileNames.size() == 0)
 {
 File localfiler = new File(DEFAULT_BILLING_DIR);
  if (((File)localfiler).exists()) {
    arrayOfString2 = ((File)localfiler).list();
    for ( str3 : arrayOfString2 ) {
          fileNames.add(DEFAULT_BILLING_DIR + str3);

    }
  }
 }

【问题讨论】:

  • 您在哪一行得到错误?从问题中不清楚。
  • 对不起,'for (str3 : arrayOfString2)'
  • 哪个java版本? Foreach 需要 java 5+..

标签: java loops for-loop


【解决方案1】:

使用增强的for循环时,必须在for语句中声明“循环变量”:

for (String s : list)

另一方面,这个类似的代码不会编译:

String s;
for (s : list)

这是language specification # 14.14.2 要求的:

EnhancedForStatement:
    for ( FormalParameter : Expression ) Statement
FormalParameter:
    VariableModifiersopt Type VariableDeclaratorId

(注意参数声明中需要Type

【讨论】:

  • 我将 For 循环重建为非增强型,它可以工作。现在我只有两个错误。
【解决方案2】:

改变

String str3;

 if (fileNames.size() == 0)
 {
 File localfiler = new File(DEFAULT_BILLING_DIR);
  if (((File)localfiler).exists()) {
    arrayOfString2 = ((File)localfiler).list();
    for ( str3 : arrayOfString2 ) {
          fileNames.add(DEFAULT_BILLING_DIR + str3);

    }
  }
 }

 if (fileNames.size() == 0)
 {
 File localfiler = new File(DEFAULT_BILLING_DIR);
  if (((File)localfiler).exists()) {
    arrayOfString2 = ((File)localfiler).list();
    for (String str3 : arrayOfString2 ) {
          fileNames.add(DEFAULT_BILLING_DIR + str3);

    }
  }
 }

【讨论】:

  • 字符串不可变与此无关。增强的for 循环只需要在for 语句本身中声明循环变量的类型。例如,参见this question
  • 哦,是的......对不起,错了
  • @AlekseiBulgak,我尝试过,但是在同一方法中还有另外两个 for 循环也使用 str3,并且在这些循环中留下了相同的问题。显然,我不想在每个循环中重新初始化 str3。
  • 我不认为你可以在不改变 for 循环的情况下做到这一点。如果你想使用 foreach 语句,你需要重新初始化 str3
【解决方案3】:
for ( str3 : arrayOfString2 ) {
          fileNames.add(DEFAULT_BILLING_DIR + str3);

必须改为

for (String str3 : arrayOfString2 ) {
          fileNames.add(DEFAULT_BILLING_DIR + str3);

【讨论】:

    【解决方案4】:

    删除您的String str3 并修改您的for

     for (String str3 : arrayOfString2 ) {
              fileNames.add(DEFAULT_BILLING_DIR + str3);
    

    【讨论】:

      【解决方案5】:

      您的问题是当您在 arrayOfString2 上循环 str3 时,因为您必须在循环内声明 str3 变量。

      像这样修复您的代码应该可以解决您的问题。

          String[] arrayOfString2 = new String[1];
      
          if (fileNames.size() == 0)
          {
             File localfiler = new File(DEFAULT_BILLING_DIR);
             if (((File)localfiler).exists()) {
                  arrayOfString2 = ((File)localfiler).list();
                  for (String str3 : arrayOfString2 ) {
                        fileNames.add(DEFAULT_BILLING_DIR + str3);
      
                  }
             }
          }
      

      更多详情,请查看The For Statement

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        相关资源
        最近更新 更多