为什么变量的范围有问题?

时间:2017-10-06 21:59:37

标签: java

有人可以帮助确定以下代码的问题...以及为什么编译变量存在问题" i $"

以下是代码......

private void handlePendingFilesForPreviousCheckpoints(Map<Long, List<String>> pendingFilesPerCheckpoint) {
        LOG.debug("Moving pending files to final location on restore.");
        Set<Long> pastCheckpointIds = pendingFilesPerCheckpoint.keySet();
        Iterator i$ = pastCheckpointIds.iterator();

        while(i$.hasNext()) {
            Long pastCheckpointId = (Long)i$.next();
            Iterator i$ = ((List)pendingFilesPerCheckpoint.get(pastCheckpointId)).iterator();

            while(i$.hasNext()) {
                String filename = (String)i$.next();
                Path finalPath = new Path(filename);
                Path pendingPath = this.getPendingPathFor(finalPath);

                try {
                    if(this.fs.exists(pendingPath)) {
                        LOG.debug("Restoring BucketingSink State: Moving pending file {} to final location after complete checkpoint {}.", pendingPath, pastCheckpointId);
                        this.fs.rename(pendingPath, finalPath);
                    }
                } catch (IOException var10) {
                    LOG.error("Restoring BucketingSink State: Error while renaming pending file {} to final path {}: {}", new Object[]{pendingPath, finalPath, var10});
                    throw new RuntimeException("Error while renaming pending file " + pendingPath + " to final path " + finalPath, var10);
                }
            }
        }

    }

即使i$第二次在花括号内定义......它说,变量i$已在范围内定义....

有人可以帮我解决这个问题......并了解上述代码中变量i $的错误。

非常感谢。

3 个答案:

答案 0 :(得分:2)

变量的范围是它定义的(整个)块,当然包括声明块内的所有子块。

要解决此问题,请使用不同的变量名称。

答案 1 :(得分:0)

您对此发表了评论:

  

但是想知道,为什么这会产生问题...因为我从其他类中复制了这个方法并且工作正常......但是我的问题正在解决......请你解释一下

确定实际所做的就是您反编译了一个类并将反编译的代码复制到源代码中。

这种方法通常不起作用。而你的是一个没有效果的例子。

典型Java反编译器的设计目标是将编译后的代码转换为程序员可以读取的内容。上面反编译的代码满足了这个要求。阅读上述内容的典型Java程序员将了解原始代码尝试执行的操作。

然而,反编译器有一些非目标

  1. 重现原始源代码不是目标。 (在数学上不可能这样做!)

  2. 制作代码是最佳实践&#34;很有型。由于许多原因,这是不切实际的。 (首先,人们不能就最佳实践达成一致意见!)

  3. In不是生成始终可编译的代码的目标。对于没有被混淆的字节码,它可能可能,但是:

    • 覆盖边缘情况真的很难,
    • 无法证明您已涵盖所有边缘案例
    • 以及需要支持其代码的编译器集合一直在增长。
  4. 这在实践中意味着什么?

    实际上,反编译器生成的代码通常 1 可读,而可能可编译,但是:

    • 您可能需要更正编译错误
    • 代码不像原始源代码 2
    • 那样可维护
    • 该代码不适合用作如何编程的示例。

    1 - 但是,如果字节码已被混淆,则所有投注均已关闭。混淆的目的是难以反编译代码和/或理解反编译代码。

    2 - 首先,当您编译代码时,编译器会丢弃所有源代码注释和(通常)局部变量的名称。然后它将各种构造(如增强型循环,内部类和lambda)转换为JVM支持的更简单的形式。这些转变是不可逆的。

答案 2 :(得分:-1)

一个简单的(但可能不是最好的)解决方案是只调用内部迭代器,如ir或其他东西。

实施例。改变这一行: Iterator i$ = ((List)pendingFilesPerCheckpoint.get(pastCheckpointId)).iterator();

这样的事情: Iterator ir = ((List)pendingFilesPerCheckpoint.get(pastCheckpointId)).iterator();