Java 方法中局部变量的初始化

Java 方法中局部变量的初始化,java,Java,鉴于下面的代码,为什么编译器会在第5行抱怨,即使优惠券、偏移量和基已在if语句中初始化?由于“percent”变量的默认值为0.0,因此if语句将运行并设置这些值 public class Discounter { static double percent; //1 int offset = 10, base= 50; //2 public static double calc(double value) { var coupon, offset, base; //3 if(p

鉴于下面的代码,为什么编译器会在第5行抱怨,即使优惠券、偏移量和基已在if语句中初始化?由于“percent”变量的默认值为0.0,因此if语句将运行并设置这些值

public class Discounter {
static double percent; //1
int offset = 10, base= 50; //2
public static double calc(double value) {
    var coupon, offset, base; //3
    if(percent <10){ //4
        coupon = 15;
        offset = 20;
        base = 10;
    }
    return coupon*offset*base*value/100; //5
}
public static void main(String[] args) {
    System.out.println(calc(100));
} }
公共类折扣店{
静态双百分比;//1
int offset=10,base=50;//2
公共静态双计算(双值){
var息票,抵销,基数;//3

如果(百分比正确。那么,稍后,我编写以下代码:

class OtherCode {
    public static void foo() {
      Discounter.percent = 20;
      calc(20);
    }
}

为了解决这个问题,java故意不去尝试将自己束缚在试图进行深入代码分析以确定事情是否已初始化的结中。它应用了一个简单且规范的检查列表。他们不会“捕捉”百分比始终低于10的情况(即使百分比并不总是小于10,但一旦你确信添加了新的类文件)。

在Java中,局部变量必须在使用之前进行显式初始化。它们没有作为实例变量提供默认值

这里有两个选项。可以将包含计算的返回语句移动到if语句中

public static double calc(double value) {
    int coupon, offset, base; // 3
    if (percent < 10) { // 4
        coupon = 15;
        offset = 20;
        base = 10;
        return coupon * offset * base * value / 100; // 5
    }
    return 0;
}

您的代码的格式和重新排列方式不同。您的一些变量没有正确初始化或放置错误

请在下面查看您的新代码,然后发表评论,看看您是否仍然需要帮助。我不太确定您在问什么。您可以缩小您的问题范围吗

package javaQuestionsAndAnswers;

public class Discounter {

public static void main(String[] args) {
    
    System.out.println("StackOverflow Problem and Solution");
    
    System.out.println(calc(100));

} 

public static double calc(double value) {
    
     double percent = 0;
     
     int coupon = 0, offset = 0, base = 0; //3
     
     if(percent <10){ //4
        coupon = 15;
        offset = 20;
            base = 10;
    
      }

    return coupon*offset*base*value/100; //5
}
}
PackageJavaQuestionsandAnswers;
公共类折扣店{
公共静态void main(字符串[]args){
System.out.println(“堆栈溢出问题和解决方案”);
系统输出打印项次(计算(100));
} 
公共静态双计算(双值){
百分之二=0;
整数优惠券=0,偏移量=0,基数=0;//3

if(percentJava将为类/实例变量分配默认值,但不会为局部变量分配默认值。必须以这种方式(通过初始化或赋值)明确分配局部变量,否则会发生编译时错误(如您所观察到的)

确保每个案例的优惠券、抵销和基本初始化


int优惠券=0,偏移量=0,基数=0;

好吧,如果
百分比
不小于10会发生什么?在这种情况下,这个方法应该返回什么?我猜你的意思是编译器应该能够分析代码,并且看到唯一可能的结果是
百分比
小于10,所以r要初始化的那些其他变量。但是如果您的代码依赖于此,为什么要检查
if
呢?如果编译器应该允许这样做,那么它还应该告诉您应该删除
if
,因为它总是
true
package javaQuestionsAndAnswers;

public class Discounter {

public static void main(String[] args) {
    
    System.out.println("StackOverflow Problem and Solution");
    
    System.out.println(calc(100));

} 

public static double calc(double value) {
    
     double percent = 0;
     
     int coupon = 0, offset = 0, base = 0; //3
     
     if(percent <10){ //4
        coupon = 15;
        offset = 20;
            base = 10;
    
      }

    return coupon*offset*base*value/100; //5
}
}