如何修复 returns 一个 int 的方法中的 int 初始化问题

How to fix int initialization issues in a method that returns an int

Java 说我的 return 值 int 没有初始化。

public static int getRow(char r)
{
    int row;
    if (r == 0) 
            row = 0;
    if (r == 1)
            row = 1;
    if (r == 2)
            row = 2;
    if (r == 3)
            row = 3;
    if (r == 4)
            row = 4;
    if (r == 5)
            row = 5;
    if (r == 6)
            row = 6;
    if (r == 7)
            row = 7;
    if (r == 8)
            row = 8;
    if (r == 9)
            row = 9; //end if
    return row;
}

return row 上有一个错误,它说 int row 还没有被初始化。这个方法是把一个char的值转换成一个int,这样就可以放在一个数组中,创建一个网格游戏。当我将 row 初始化为 0 时,它不会命中任何 if 语句并将值保持为零。该游戏是一款战舰游戏,因此值被验证为 0-9

如果r不在0 to 9范围内怎么办?然后未初始化的 row 将是 return!这就是为什么你被迫初始化 row.

用默认值初始化row,或放置一个else块。

我不确定,但你在找 Character#getNumericValue 吗? Read more.

所以你可以很容易地做到这一点:

public static int getRow(char r) {
    return Character.getNumericValue(r);
}

但要小心

If the character does not have a numeric value, then -1 is returned. If the character has a numeric value that cannot be represented as a nonnegative integer (for example, a fractional value), then -2 is returned.

Test live.

if 个语句中的 none 个可能是 true

如果在 else 块中添加 else 并设置 row 的值,编译器将检测到没有导致未初始化值的代码路径row 故障将消失。

假设您期望的是“0”到“9”范围内的字符,那么此代码将为您提供您在上面尝试生成的结果:

 public static int getRow(char r){
      return r - '0';
 }

您声明了 int row; 但您没有为其分配任何值。

当你的r不在['0' - '9']时,row将没有任何价值,因为你没有给它赋值。这就是为什么你必须初始化 row

您可以进一步简化函数:

public static int getRow(char r)
{
  if( r >= '0' && r <= '9')
    return r - '0';
  else
    return -1; // or any other value according to your logic
}

首先,如果所有 if 语句都为假,row 将没有值。这就是你出错的原因。

其次,这个方法的"structure"IMO,太单调了,可以清理一下。让我们将 -1 视为标记值。

public static int getRow(char r)
{
    int row = -1;
    if ('0' <= r && r <= '9') {
        row = r - '0';
    }
    return row;
}

即使 shorter/cleaner 有三元运算符但没有局部变量:

public static int getRow(char r) {
    return ('0' <= r && r <= '9') ? r - '0' : -1
}

我猜这是因为您将字符与整数值而不是字符值进行比较。

r == 3;
//is not the same as 
r == '3';

编辑:

如果您想简单地修复您的代码,否则(因为有人指出,您缺少明确的初始化),您可以删除您的一个案例并将其设为您的其他案例。

{
    int row;
    if (r == 0) 
            row = 0;
    else if (r == 1)
            row = 1;
    else if (r == 2)
            row = 2;
    else if (r == 3)
            row = 3;
    else if (r == 4)
            row = 4;
    else if (r == 5)
            row = 5;
    else if (r == 6)
            row = 6;
    else if (r == 7)
            row = 7;
    else if (r == 8)
            row = 8;
    else (r == 9)
            row = 9; //end if
    return row;
}

这与所谓的 "switch - case":

基本相同
//char r
switch(r)    {
    case '0': row = 0;
              break;
    case '1': row = 1;
              break;
    case '2': row = 2;
              break;
    case '3': row = 3;
              break;
    case '4': row = 4;
              break;
    case '5': row = 5;
              break;
    case '6': row = 6;
              break;
    case '7': row = 7;
              break;
    case '8': row = 8
              break;
    default: row = 9; 
}
return row;

Java的编译器足够聪明,可以发现至少有一个实例应该已经初始化并继续前进。

它可以处理一些更复杂的情况,但如果...其他...应该总是通过。

在战列舰的上下文中,您的输入范围是“0”-“9”,因此您可以假设如果您给它任何其他内容,它就是垃圾输入。

但是请注意,这不一定是最好的解决方案,只是最明显的。查看此处的其他答案以获得更多见解。

您将来可能做的大部分事情都与处理字符或字符串以及提取数据有关,就像您在这里做的那样。

//char r
return Integer.parseInt(r +""); //+"" converts 'r' to "r"
//or, as mentioned below
return Character.getNumericValue(r); 
//works for things like roman numerals     
//but also will always return SOME value.
//Be aware of this, because you may not expect to get an int for 'a'

将 return 一个整数,或者抛出一个 NumberFormatException,没有进一步的检查。

代码行 int row; 声明了 一个名为 row 的整型变量。要 初始化 你的 row 变量,你需要给它一个值。如果您的字符 r 不在 0 和 9 之间,您的 row 变量将永远不会被赋值。

您可以在同一行中声明初始化您的行变量,例如:

int row = 0;

但是,Java 有一个内置方法可以为您进行这种转换,因此您无需编写自己的方法来进行转换。您可以简单地调用内置方法 Character.getNumericValue(char r).

而不是创建 getRow(char r) 方法

为了使您的代码正常工作,请初始化 int row = -1; //如下

public static int getRow(char r)
{
int row = -1;
if (r == 0) 
        row = 0;
if (r == 1)
        row = 1;
if (r == 2)
        row = 2;
if (r == 3)
        row = 3;
if (r == 4)
        row = 4;
if (r == 5)
        row = 5;
if (r == 6)
        row = 6;
if (r == 7)
        row = 7;
if (r == 8)
        row = 8;
if (r == 9)
        row = 9; //end if
return row;
}

return 值为 -1 表示传递了值 0 到 9 中的 none。

但是这里传递的参数是char。因此,如果您想比较字符,请使用单引号“1”。即如果您想查看输入是否为字符 1.

public static int getRow(char r)
{
int row;
if (r == '0') 
        row = 0;
if (r == '1')
        row = 1;
if (r == '2')
        row = 2;
if (r == '3')
        row = 3;
if (r == '4')
        row = 4;
if (r == '5')
        row = 5;
if (r == '6')
        row = 6;
if (r == '7')
        row = 7;
if (r == '8')
        row = 8;
if (r == '9')
        row = 9; //end if
return row;
}

在您的代码中,被比较的字符是对应于 ASCII 0 到 9 的字符。 假设你想 return 相同的 int 作为 char 传递,你可以在没有任何 if 的情况下处理它。只是 return r - 48;或 return r - '0';因为 48 是 ASCII 值 0;

public static int getRow(char r)
{
    return r - 48;
}

如果您的 if 语句中的 none 不成立,那么 return 的值是多少?您可以将 "row" 变量初始化为某物,因为局部变量不像实例变量,它们需要用某物初始化,因为它们没有称为默认值的东西。

public static int getRow(char r)
{
    int row=-1;
    if (r == 0) 
            row = 0;
    if (r == 1)
            row = 1;
    if (r == 2)
            row = 2;
    if (r == 3)
            row = 3;
    if (r == 4)
            row = 4;
    if (r == 5)
            row = 5;
    if (r == 6)
            row = 6;
    if (r == 7)
            row = 7;
    if (r == 8)
            row = 8;
    if (r == 9)
            row = 9; //end if
    return row;
}

所以一旦你像上面那样初始化你的变量,如果你的 if 语句的 none 评估为真那么它 returns -1

同时使用 switch 语句来代替这些 if statements.it 将更加清晰和最佳实践。