2016-02-20 58 views
-1
int i = 3; 
int j = 2; 
int k = 1; 

Printer printer = new Printer(); 

if (printer.getTotalAmount() > 0) { 
    if (printer.getType().equals("canon")) { 
     if (i >= j) { 
     i = i-j; // i=3-2, so i will be 1 now 
     } 
    } 
    if (printer.getType().equals("epson")) { 
     if (i >= k) { 
     i = i - k; // it should be i = 1-1 and i will be 0 now 
     } 
    } 
} 

我的問題是,可變i的值不被先前的if語句之後更新。由於塊範圍,變量i的值仍然是3.內更新從外範圍的可變的值,如果塊

我該如何解決這個問題?

+2

你的問題不清楚。如果if條件不匹配,那麼如果阻塞,控制將不會進入內部。所以它不會執行'i = i-j'操作。 而if-else不是循環。它的一個條件塊 – Rehman

+2

可能是問題內if條件?請張貼他們。 –

+2

你的代碼很好,範圍確定 - 該變量屬於它聲明的範圍,所以在'if'裏更新它是可以的,並且應該是可見的。問題在別的地方。發佈整個剪輯不起作用。 – Ishamael

回答

0

您的兩個if語句表示相互排斥的條件。打印機的類型可以是「canon」,也可以是「epson」。從來沒有。因此,只有兩個if條件中的一個會被滿足,並且只有兩個代碼塊中的一個會被執行。

舉例來說,您的打印機類型是「epson」。當評估第一個條件時,它將檢查「epson」是否等於「canon」。由於它們是而不是相等,因此條件評估爲false,並且if() {/* code */}塊中的所有代碼都被完全跳過。

您在導致問題的範圍背後的理論不準確:由於該變量聲明在if塊之外,因此更新後的值將反映在每個有權訪問該變量的位置。

您需要更新自己的邏輯以說明只有其中一種情況會發生,或者如果這只是代碼簡化,則可以找到類似於您的真實代碼的更合適的方案。

如果還不清楚,請在if語句上查看Oracle的tutorial可能會有幫助。

0

我想你應該添加調試語句來更多地瞭解你的程序 流監守你沒有提到的printer.getTotalAmount()printer.getType() 上的i值取決於價值和。 例如

System.out.println("Total Amount:"+ printer.getTotalAmount()); 
if (printer.getTotalAmount() > 0) { 
    System.out.println("Type:"+ printer.getType()); 
    if (printer.getType().equals("canon")) { 
     System.out.println("inside if canon"); 
     if (i >= j) { 
     i = i-j; // i=3-2, so i will be 1 now 
     } 
    } 
    if (printer.getType().equals("epson")) { 
     System.out.println("inside if epson"); 
     if (i >= k) { 
     i = i - k; // it should be i = 1-1 and i will be 0 now 
     } 
    } 
}