在IF语句中定义变量(Java)

时间:2017-07-22 07:42:39

标签: java if-statement compiler-errors

我正在学习Java,作为其中的一部分,我正在尝试创建一个随机数生成器。

该项目仍处于早期阶段但是当我制作错误检查器组件时,我遇到了一些问题,我一直在想它为什么不能以这种方式工作。

以下是错误检查程序,其中包含numberAmount(用户请求的随机数的数量)和randomDigit(随机数的最大数字)。

我希望这样做,以便在金额或数字过高时标记,这可能会导致应用程序崩溃。

以下是代码。

<form method="post">

当我没有插入public static boolean errorCheck(int numberAmount, int numberDigit){ //int checkAmount = 0; //int checkDigits = 0; if (numberAmount > 15){ System.out.println("We can't generate that many numbers!"); int checkAmount = 1; } else if (numberAmount < 0){ System.out.println("We can't generate negative amount of numbers!"); int checkAmount = 1; } else if (numberAmount == 0) { System.out.println("Zero numbers requested"); int checkAmount = 1; } else { int checkAmount = 0; } if (numberDigit > 15){ System.out.println("We can't generate that many numbers!"); int checkDigit = 1; } else if (numberDigit < 0){ System.out.println("We can't generate negative amount of numbers!"); int checkDigit = 1; } else if (numberDigit == 0) { System.out.println("Zero numbers requested"); int checkDigit = 1; } else { int checkDigit = 0; } if (checkAmount == 1 || checkDigit == 1){ return true; } else { return false; } } int checkAmount = 0;时,由于没有可参考的变量而导致int checkDigits = 0;语句错误。但是,如果我在第一个和第二个last if语句中包含所有检查变量,我会得到预先存在的局部变量的错误。

我已经尝试了一些修复并在线阅读但我仍然不明白为什么我无法在if语句中定义或覆盖变量。

5 个答案:

答案 0 :(得分:2)

  

我仍然不明白为什么我无法在if语句中定义或覆盖变量。

您可以在if语句的受控块中定义它们,但任何变量定义都会在封闭范围的末尾消失。

您无法覆盖已在同一方法中声明的变量。

你需要这样的东西:

int checkAmount = 0;

if (numberAmount > 15){
    System.out.println("We can't generate that many numbers!");
    checkAmount = 1;
} else // ...

答案 1 :(得分:1)

你不能这样做(定义{{​​1}}的本地变量) - 至少它没有意义。你也不需要if。像,

return true

我还注意到这个验证中有共同的消息传递; 可以然后进一步简化,如

if (numberAmount > 15) {
    System.out.println("We can't generate that many numbers!");
    return true;
} else if (numberAmount < 0) {
    System.out.println("We can't generate negative amount of numbers!");
    return true;
} else if (numberAmount == 0) {
    System.out.println("Zero numbers requested");
    return true;
}
if (numberDigit > 15) {
    System.out.println("We can't generate that many numbers!");
    return true;
} else if (numberDigit < 0) {
    System.out.println("We can't generate negative amount of numbers!");
    return true;
} else if (numberDigit == 0) {
    System.out.println("Zero numbers requested");
    return true;
}
return false;

答案 2 :(得分:0)

Elliot的答案是正确的,但是如果你想在if-else块中使用变量,你应该将声明和赋值分开:

int check;
if(...){
    check = 42;
}else{
    // do something else with check
}

答案 3 :(得分:0)

在Java中,变量在scopes中定义。

正如您刚刚遇到的那样,您无法使用在if块之外的if块范围内声明的变量。

范围内定义的内容无法在范围之外访问。如果您需要在多个块中使用变量,还应声明它们在您想要使用变量的块的公共范围内。

简短的解释是,为了遵守封装原则,您需要将数据保存在您需要的位置,并且范围是这种意义上的工具。您可以在需要的地方声明变量,并且只能在那里使用变量。

有关范围的更多信息,请访问:http://www.geeksforgeeks.org/variable-scope-in-java/

你在函数开头声明变量的解决方案是在几个块之间共享状态的正确方法,即使正如@ElliottFrisch所提到的那样,一个更有经验的程序员也不会像你那样写这种行为。

答案 4 :(得分:-1)

当您在if(或任何其他块)中声明变量时,该变量的范围仅限于该块,因此,如果您尝试在范围之外使用它,编译器将显示错误。

现在,如果您将变量初始化为0构造之外的if,则所有if构造以及剩余方法都可以看到它们。但是,您需要做的就是在re-declare内分配值,而不是if,例如:

public static boolean errorCheck(int numberAmount, int numberDigit){

    int checkAmount = 0;
    int checkDigits = 0;

    if (numberAmount > 15){
        System.out.println("We can't generate that many numbers!");
        checkAmount = 1;
    } else if (numberAmount < 0){
        System.out.println("We can't generate negative amount of numbers!");
        checkAmount = 1;
    } else if (numberAmount == 0) {
        System.out.println("Zero numbers requested");
        checkAmount = 1;
    }

    if (numberDigit > 15){
        System.out.println("We can't generate that many numbers!");
        checkDigit = 1;
    } else if (numberDigit < 0){
        System.out.println("We can't generate negative amount of numbers!");
        checkDigit = 1;
    } else if (numberDigit == 0) {
        System.out.println("Zero numbers requested");
        checkDigit = 1;
    }


    return checkAmount == 1 || checkDigit == 1;
}

if之外声明和初始化变量,并在int checkAmount = 1;中包含if之类的语句意味着具有相同名称的变量被声明两次,因此编译器显示pre-existing local variable错误。

关于流程还有几点:

  • 您最终不需要else个阻止0值变量,因为它们已经使用0初始化
  • 您可以直接返回checkAmount == 1 || checkDigit == 1的结果,而不是撰写另一组if..else语句