2016-02-20 43 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 
     } 
    } 
}