2010-01-14 53 views
2

我有下面的Java代碼片斷JAVA:如果沒有大括號,並就繼續

while (condition1){ 
    switch (someinteger){ 
     case 1: 
      if(condition2) continue; 
      // other stuff here 
      break; 
     // other cases here 
    } 
} 

一切都很好。當我生成一個類文件,然後使用免費工具(JD-gui)對其進行反編譯時,我找回了下面的代碼。

while (condition1){ 
    switch (someinteger){ 
     case 1: 
      if(!condition2); 
      // other stuff here 
      break; 
     // other cases here 
    } 
} 

所以它的變化if(condition2) continue;if(!condition2); 我無法找到其他任何信息if語句(不含括號)。 任何人都可以在這裏解釋邏輯嗎?提前致謝。

編輯:我做了一些更多的測試,反編譯器無法正常工作。

這裏是之前的代碼:

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException{ 
    int commentON=0, quoteON=0; 
    int b1; 
    while ((b1 = f1.read()) != -1){ 
     switch ((char) b1){ 
      case '\\': 
        if (commentON==0){ 
          quoteON = 1; 
          break; 
        } 
        continue; 
      case '\n': 
        if (commentON>0){ commentON=0; continue; } 
        break; 
      case '%': 
        if (commentON>0) continue; 
        if (quoteON>0) { quoteON=0; break; } 
        commentON=2; 
        continue; 
      default: 
        if (commentON>0) continue; 
        if (quoteON>0) quoteON=0; 
        break; 
     } 
     f2.write(b1); 
    } 
} 

這裏是反編譯的代碼

public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException 
{ 
int commentON = 0; int quoteON = 0; 

while ((b1 = f1.read()) != -1) 
{ 
    int b1; 
    switch ((char)b1) 
    { 
    case '\\': 
    if (commentON == 0); 
    quoteON = 1; 
    break; 
    case '\n': 
    if (commentON <= 0) break label109; commentON = 0; break; 
    case '%': 
    if (commentON <= 0); 
    if (quoteON > 0) { quoteON = 0; break label109: } 
    commentON = 2; 
    break; 
    } 
    if (commentON <= 0); 
    if (quoteON > 0) quoteON = 0; 

    label109: f2.write(b1); 
} 
} 

抱歉打擾大家。 :P 如果可以,我會嘗試刪除此問題。

+0

順便說一句...即時通訊不爭論反編譯代碼的正確性。我只是感到驚訝,如果(條件2)繼續;'是相同的'如果(!condition2);' 這是否意味着執行自動繼續從正確的點(在這種情況下,'while循環的開始)? – Jus12 2010-01-14 00:54:32

+0

它只是我還是他們不是邏輯上相同。 在第一組代碼中,如果condition1 = true且someInteger = 1且condition2 = true,那麼 //這裏的其他東西不會被執行。 但在具有相同條件的第二個代碼塊中'//其他的東西在這裏* *將被執行。 – David 2010-01-14 00:56:43

+0

@大衛 - 我和你在一起,我沒有看到它。 – danben 2010-01-14 01:00:03

回答

4

反編譯器幾乎不可能重構您的原始語法,因爲它們正在處理編譯器對您的代碼的解釋。

您編寫的java代碼由java編譯器編譯爲字節代碼。

反編譯器然後嘗試從字節碼創建java代碼。

由於兩個代碼片段在邏輯上是相同的,所以反編譯器完成了它的工作。

EDIT(看到你的評論):

實際上,它很可能(這是很常見的),該反編譯器已經犯了一個錯誤。

該聲明if(!condition2);基本上沒有任何影響(條件2確實是一個布爾值而不是僞代碼)。

因此,無論condition2在反編譯版本中如何處理您的第一個//other stuff here

你確定反編譯的代碼工作正常嗎?

+0

OP有可能認爲'//其他的東西在這裏'仍然會出現在那裏。請參閱@ Anon的問題評論。 – David 2010-01-14 01:04:34

+0

我同意,無論是或解編譯器錯誤,這在我的經驗是相當普遍的,雖然我沒有使用他提到的解編譯器。 – pstanton 2010-01-14 01:20:54

1

一個沒有body的if語句(「沒有花括號」)只是一個空的if語句,不執行代碼。

+0

錯誤 - 這是一個if語句,如果條件爲真,則執行下一行代碼,如果它是假的,則跳過... – Basic 2013-02-28 12:01:31

+0

@Basic:一般情況下爲真,但是您將我的回答置於背景之外; OP使用短語「沒有花括號」來表示「if(!condition2);'語句。 – mipadi 2013-02-28 14:09:45

+0

我的錯誤。重讀Q後,你是對的。 – Basic 2013-02-28 14:11:35

0

它是相同邏輯的替代/規範表示。反編譯器不保存代碼。