如何在返回int的方法中修复int初始化问题

时间:2015-08-03 19:56:11

标签: java initialization int

Java说我的返回值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

9 个答案:

答案 0 :(得分:2)

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

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

我不确定,但您在寻找Character#getNumericValue吗? Read more

所以你可以轻松地做到这一点:

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

但要小心

  

如果字符没有数字值,则返回-1。如果字符的数值不能表示为非负整数(例如,小数值),则返回-2。

Test live.

答案 1 :(得分:1)

要使代码正常工作,请初始化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;
}

返回值为-1表示没有传递0到9的值。

但是这里传递的参数是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对应的字符。 假设你想要返回作为char传递的同一个int,你可以不用任何if来处理它。刚回来r - 48;或者返回r - '0';因为48是ASCII值0;

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

答案 2 :(得分:0)

$http.get(url, {responseType: "arraybuffer"} ).then(function(response) { $scope.image= response.data; }); 语句中没有一个是if

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

答案 3 :(得分:0)

假设你期望一个字符在'0'到'9'范围内,那么这段代码将为你提供你想要产生的结果:

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

答案 4 :(得分: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
}

答案 5 :(得分:0)

首先,如果所有row语句都为false,则if将没有值。这是导致错误的原因。

第二,&#34;结构&#34;这种方法,IMO,太单调,可以清理。我们将-1视为哨兵值。

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

使用三元运算符并且没有局部变量时更短/更清洁:

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

答案 6 :(得分:0)

代码行int row; 声明一个名为row的整数变量。要初始化您的row变量,您需要为其赋值。如果您的角色r不在0到9之间,则您的row变量将永远不会分配给它。

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

int row = 0;

但是,Java有一种内置方法可以为您执行此转换,因此您不需要编写自己的方法来执行此操作。您可以简单地调用内置方法getRow(char r),而不是创建Character.getNumericValue(char r)方法。

答案 7 :(得分:0)

如果你的if语句都不是真的那么返回值是多少?您可以初始化&#34; row&#34;由于局部变量不像实例变量,因此需要使用某些东西进行初始化,因为它们不具有称为默认值的东西。

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语句都没有评估为true,那么它返回-1

同样使用switch语句而不是这些if语句。这将是非常明确和最佳实践。

答案 8 :(得分:-3)

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

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

这与所谓的&#34;开关 - 案例&#34;基本相同:

//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编译器非常聪明,可以发现至少有一个实例应该已经初始化并继续前进。

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

在战列舰的背景下,您的输入范围是&#39; 0&#39; 0 - &#39; 9&#39;,所以你可以假设,如果你曾经给它任何其它垃圾输入。

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

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

//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'

将返回一个整数,或者抛出NumberFormatException,而不进一步检查。