为什么内部的价值如果声明'在java中,如果语句'?之外无法访问

时间:2015-01-19 17:40:29

标签: java

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

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

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

6 个答案:

答案 0 :(得分:5)

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

使用double answer = 0初始化它。

答案 1 :(得分: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或返回

答案 2 :(得分:0)

如果所有ifs中的所有条件都为false,则确实不会初始化变量answer。

说选择是42245234,这行答案有什么价值?

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

答案 3 :(得分:0)

在打印之前使用answer之类的值初始化answer=-1因为我们如何打印空引用

  

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

  1. 如果“choice”不属于“1,2,3,4”,则可能不会出现var“answer”。因此,当您尝试在最后打印时,可能会发生此异常。

  2. 第二个实际上存在同样的问题,使其工作的唯一原因是您将打印行移动到每个块。所以当“选择”不属于“1,2,3,4”时,代码不需要做什么。它将被视为“没问题”。

  3. 对于修复,以上所有内容:)