簡體   English   中英

為什么變量的范圍有問題?

[英]why is there an issue with scope of the variable?

有人可以幫助確定以下代碼的問題......以及為什么在編譯變量“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$ 有什么問題。

非常感謝。

變量的范圍是定義它的(整個)塊,當然包括聲明塊中的所有子塊。

要解決此問題,請使用不同的變量名稱。

你評論了這個:

但想知道,為什么這會產生問題......因為我從其他類復制了這個方法並且工作正常......但我的正在產生問題......你能解釋一下嗎

好的,您實際上所做的是反編譯一個類並將反編譯的代碼復制到您的源代碼中。

這種方法往往行不通。 而你的就是一個沒有奏效的例子。

典型 Java 反編譯器的設計目標是將編譯后的代碼翻譯成程序員可以閱讀的內容 上面的反編譯代碼滿足了這一點。 閱讀上述內容的典型 Java 程序員將理解原始代碼試圖做什么。

然而,反編譯器有幾個非目標

  1. 重現原始源代碼不是目標。 (這在數學上是不可能的!)

  2. 生成風格上“最佳實踐”的代碼並不是目標。 由於多種原因,這是不切實際的。 (首先,人們無法就什么是最佳實踐達成一致!)

  3. In 不是生成始終可編譯的代碼的目標。 對於沒有被混淆的字節碼來說可能是可能的,但是:

    • 很難涵蓋邊緣情況,
    • 不可能證明你已經涵蓋了所有的邊緣情況
    • 您需要支持的編譯器集一直在增長。

這在實踐中意味着什么?

實際上,由反編譯器生成的代碼通常是1可讀的,並且可能是可編譯的,但是:

  • 您可能需要更正編譯錯誤
  • 代碼不像原始源代碼那樣可維護2
  • 該代碼不適合用作如何編程的示例。

1 - 但是,如果字節碼已被混淆,則所有賭注都將關閉。 混淆的目的是使反編譯代碼和/或理解反編譯代碼變得困難

2 - 首先,當您編譯代碼時,編譯器會丟棄所有源代碼注釋和(通常)局部變量的名稱。 然后它將各種結構(例如增強循環、內部類和 lambda 表達式)轉換為 JVM 支持的更簡單的形式。 這些轉變是不可逆的。

一個簡單的(但可能不是最好的)解決方案是將內部迭代器稱為ir其他東西。

前任。 更改這一行: Iterator i$ = ((List)pendingFilesPerCheckpoint.get(pastCheckpointId)).iterator();

像這樣: Iterator ir = ((List)pendingFilesPerCheckpoint.get(pastCheckpointId)).iterator();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM