【问题标题】:Updating the value of a variable from the outer scope within an if block从 if 块中的外部范围更新变量的值
【发布时间】:2016-02-20 06:32:04
【问题描述】:
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 块。所以它不会做i=i-j操作。 if-else 不是循环。它是一个条件块
  • if 条件内部可能有问题?请张贴。
  • 您的代码很好,范围也可以——变量属于声明它的范围,因此在if 内更新它是可以的并且应该是可见的。问题出在其他地方。发布不起作用的整个片段。
  • 这里最重要的是您正在评估的条件。因此,如果您可以分享不起作用的实际代码,帮助您会更容易。
  • 我编辑了我的问题。请看一下

标签: java if-statement scope


【解决方案1】:

您的两个if 语句代表互斥条件。打印机的类型可以是“canon”,也可以是“epson”。从不两者兼而有之。所以只会满足你的两个if条件中的一个,并且只会执行两个代码块中的一个。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2013-05-10
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多