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


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。

如何解决这个问题?

您的两个if语句表示互斥条件。打印机的类型可以是"佳能",也可以是"爱普生"。永远不要两者兼而有之。因此,将只满足两个if条件中的一个,并且只会执行两个代码块中的一个。

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

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

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

如果仍然不清楚,查看 Oracle 关于 if 语句的教程可能会有所帮助。

我认为您应该添加调试语句以了解有关程序流程的更多信息因为你没有提到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
      }
   }
}

最新更新