【问题标题】:why the value inside 'if statement' in java cannot be accessed outside of 'if statement'?为什么java中'if语句'中的值不能在'if语句'之外访问?
【发布时间】:2015-01-19 17:40:29
【问题描述】:

以下代码给出错误消息“线程“主”java.lang.Error 中的异常:未解决的编译问题: 局部变量 answer 可能尚未初始化。

package firstproject;
import java.util.Scanner;

public class calculator {
    public static void main(String args[]){

        double firstno, secondno, answer;
        int choice;
        Scanner add = new Scanner(System.in);

        System.out.println("What r u trying to do??");
        System.out.println("1 - add");
        System.out.println("2 - substract");
        System.out.println("3 - multiplication");
        System.out.println("4 - division");

        choice = add.nextInt();

        System.out.print("Enter your 1st number: ");
        firstno = add.nextDouble();

        System.out.print("Enter another number: ");
        secondno = add.nextDouble();

        if(choice == 1){
            answer = firstno + secondno;
        }
        if(choice == 2){
            answer = firstno - secondno;
        }
        if(choice == 3){
            answer = firstno * secondno;
        }
        if(choice == 4){
            answer = firstno / secondno;
        }

        System.out.println("answer: " + answer);
    }
}

所以,我做了这样的事情

package firstproject;
import java.util.Scanner;

public class calculator {
    public static void main(String args[]){

        double firstno, secondno, answer;
        int choice;
        Scanner add = new Scanner(System.in);

        System.out.println("What r u trying to do??");
        System.out.println("1 - add");
        System.out.println("2 - substract");
        System.out.println("3 - multiplication");
        System.out.println("4 - division");

        choice = add.nextInt();

        System.out.print("Enter your 1st number: ");
        firstno = add.nextDouble();

        System.out.print("Enter another number: ");
        secondno = add.nextDouble();

        if(choice == 1){
            answer = firstno + secondno;
            System.out.println("Answer: " + answer);
        }
        if(choice == 2){
            answer = firstno - secondno;
            System.out.println("Answer: " + answer);
        }
        if(choice == 3){
            answer = firstno * secondno;
            System.out.println("Answer: " + answer);
        }
        if(choice == 4){
            answer = firstno / secondno;
            System.out.println("Answer: " + answer);
        }
    }
}

成功了。但我想知道为什么我的第一个代码不起作用。

【问题讨论】:

  • 因为answer在方法结束时使用时不保证有值。
  • 想想如果choice5,当你到达System.out.println("answer: " + answer); 时会发生什么。

标签: java


【解决方案1】:

可以访问它,但如果您的条件都不是true,则answer 在您尝试打印时将不会被初始化。

double answer = 0初始化它。

【讨论】:

  • 好吧,用一个值初始化它是 one 选项 - 但它不一定是最有用的选项。如果选择不匹配,也许正确的做法是从方法返回,或者抛出异常,或者做其他事情。
  • 显式初始化变量绝不是一个糟糕的选择。但是,问题不是关于如何处理问题的最佳方法(--> Code Review),而是为什么会发生异常。
  • 我不同意 - 如果永远不需要该值,这 一种不好的做法。该代码具有误导性,应进行重构以确保在未分配有意义的值的情况下不会尝试读取它。
【解决方案2】:

Java 中的局部变量无法读取,除非它们是 definitely assigned - 换句话说,如果编译器可以证明您可以通过各种方式获取试图读取的表达式该变量将通过对该变量的赋值。

在您的情况下,如果 choice 不是 1、2、3 或 4,您将不会完成分配。

解决方法:

  • 在变量声明中指定一个初始值
  • 将您的 if 系列更改为 if/else 系列,并在末尾添加一个普通的 else,这会终止方法或分配一个值。例如:

    if (choice == 1) {
        answer = firstno + secondno;
    } else if (choice == 2) {
        answer = firstno - secondno;
    } else  if (choice == 3) {
        answer = firstno * secondno;
    } else if(choice == 4) {
        answer = firstno / secondno;
    } else {
        System.out.println("Invalid choice");
        return; // Or assign a value to answer
    }
    
  • 使用switch 语句而不是if 语句,并提供一个default 大小写,它可以分配给answer 或返回

【讨论】:

  • 我知道 switch 语句,并且我已经尝试过 if else 语句,但它没有用,但“return”起到了作用。我想问你“返回”到底做了什么???
  • @Nawa:这是唯一没有分配answer 的路径——所以当你到达System.out.println("answer: " + answer); 时,可以到达那里的每条路径确实为answer分配了一个值...它在那个时候肯定分配了
【解决方案3】:

如果所有if中的所有条件都为假,那么变量answer确实不会被初始化。

假设选择是 42245234,那么 answer 在这一行有什么值?

System.out.println("answer: " + answer);

【讨论】:

    【解决方案4】:

    在打印之前用@​​987654322@之类的一些值初始化answer因为我们可以打印一个空引用

    一旦任何变量初始化,它就可以在条件语句体中使用

    假设 您没有输入有效的选择answer 中的值是什么,而 answer 就像一个 空引用

    【讨论】:

      【解决方案5】:

      “局部变量答案可能尚未初始化”是准确的。如果用户输入“5”,那么 answer 不会被设置为任何值。尝试将答案定义为“answer = 0.0”。

      【讨论】:

        【解决方案6】:
        1. 如果“choice”不属于“1,2,3,4”,则变量“answer”可能不会被初始化。因此,当您尝试在最后打印它时,可能会发生此异常。

        2. 第二个实际上有同样的问题,唯一的原因是你将打印行移到每个块。所以当“choice”不属于“1,2,3,4”时,代码不需要做任何事情。并且会被认为“没问题”。

        3. 对于修复,所有这些都在上面:)

        【讨论】:

          猜你喜欢
          • 2015-07-02
          • 2021-12-27
          • 1970-01-01
          • 1970-01-01
          • 2020-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多