从if块中的外部作用域更新变量的值

时间:2016-02-20 06:32:04

标签: java if-statement scope

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 个答案:

答案 0 :(得分:0)

您的两个if语句代表互斥条件。打印机的类型可以是" canon"或者它可以是" epson"。从来没有。因此,只会满足您的两个if条件中的一个,并且只会执行两个代码块中的一个。

例如,假设您的打印机的类型是" epson"。当评估第一个条件时,它将检查" epson"等于"佳能"。由于它们相等,因此条件的计算结果为false,并且if () {/* code */}块内的所有代码都被完全跳过。

导致问题的范围背后的理论并不准确:由于变量是在if块之外声明的,因此更新后的值将反映在每个有权访问该变量的位置。 / p>

您需要更新您的逻辑,以便考虑到只会发生其中一个场景的事实,或者,如果只是简化代码,请找到一个类似于您的真实代码的更合适的场景。

如果仍然不清楚,if声明中的Oracle tutorial可能会有所帮助。

答案 1 :(得分:0)

我认为您应该添加调试语句以了解有关程序流程的更多信息 因为你没有提到printer.getTotalAmount()printer.getType()的价值 取决于i的值。 e.g。

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
      }
   }
}