【问题标题】:Why do I have to initialise variable?为什么我必须初始化变量?
【发布时间】:2020-05-31 14:07:53
【问题描述】:

我的代码正在检查给定的字符串是否为某种格式。字符串的第一个字符必须是大写字母,字符串的其余部分必须是从 1 到给定维度的任意数字。

如果字符串的第一个字符包含来自字母数组的字符串,则代码会检查字符串的其余部分是否包含来自 numbers 数组的数字。要成为有效坐标,两个条件都必须为真,如果其中一个为假,则不是有效坐标。我想返回布尔值 isValidCoordinate 但 IntelliJ 告诉我我必须初始化 isValid 坐标。为什么我必须初始化它,布尔表达式取决于'if'条件。

谢谢。

public static boolean validCoordinate(String coordinate, int dimension) {
        boolean isValidCoordinate;
        String [] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        int [] numbers = new int [dimension];
        int one = 1;
        for(int i = 0; i < dimension; i++){
            numbers[i] = one + i;
        }
        for(int i = 0; i < dimension; i++){
            if((Character.toString(coordinate.charAt(0))).contains(alphabet[i])) {
                for(int j = 0; j < dimension; j++) {
                    if ((coordinate.substring(1)).contains(Integer.toString(numbers[j]))) {
                        isValidCoordinate = true;
                    }
                    else {
                        isValidCoordinate = false;
                    }
                }

            }
            else {
                isValidCoordinate = false;
            }

        }

        return isValidCoordinate;
    }

这是我的最终代码:

public static boolean validCoordinate(String coordinate, int dimension) {
        boolean isValidCoordinate;
        String [] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        int [] numbers = new int [dimension];
        int one = 1;
        for(int i = 0; i < dimension; i++){
            numbers[i] = one + i;
        }
        for(int i = 0; i < dimension; i++){
            if((Character.toString(coordinate.charAt(0))).contains(alphabet[i])) {
                for(int j = 0; j < dimension; j++) {
                    if ((coordinate.substring(1)).contains(Integer.toString(numbers[j]))) {
                        isValidCoordinate = true;
                    }
                    else {
                        isValidCoordinate = false;
                    }
                }

            }
            else {
                isValidCoordinate = false;
            }

        }

        return true;
    }

【问题讨论】:

  • 因为在您的情况下,您的布尔值可能永远不会分配任何值。只需使用“boolean isValiedCoordinate = false”对其进行初始化即可。
  • 为什么要创建一个包含所有字母字符的数组?使用 Regex OR 取决于每个字符的 ASCII 码
  • 我不知道如何做正则表达式,对不起。

标签: java arrays initialization boolean


【解决方案1】:

for 循环内的所有情况都被覆盖,但dimension 为 0 时的情况除外。

该方法将直接转到return isValidCoordinate;,其中变量尚未初始化。

【讨论】:

  • 维度不是列表。
【解决方案2】:

可能永远不会进入您的 for 循环(例如,如果 dimension == 0)。在这种情况下,您永远不会为 isValidCoordinate 赋值,但您会尝试在方法的最后一条语句中返回该变量的值。

在这种情况下isValidCoordinate 的值是多少?

它没有任何价值。

因此,编译器强制您为isValidCoordinate 分配一个初始值,以确保它在被访问之前有一个值。

编辑:

根据您的 cmets,我建议您消除 boolean 变量,并改用 return 语句:

public static boolean validCoordinate(String coordinate, int dimension) {
    String [] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    int [] numbers = new int [dimension];
    int one = 1;
    for(int i = 0; i < dimension; i++){
        numbers[i] = one + i;
    }
    for(int i = 0; i < dimension; i++){
        if((Character.toString(coordinate.charAt(0))).contains(alphabet[i])) {
            for(int j = 0; j < dimension; j++) {
                if ((coordinate.substring(1)).contains(Integer.toString(numbers[j]))) {
                    return true;
                }
            }
        }
    }

    return false;
}

这样,当boolean 变量设置为true 时,您不必担心会跳出嵌套循环。

【讨论】:

  • 即使我初始化了 isValidCoordinate 真假,输出也只是假的。 “A1 5”给了我错误,“hjsu 10”也是如此。
  • @KaleJoe 这是一个不同的问题。我不确定确切的逻辑是什么,但也许你想在isValidCoordinate = true; 之后跳出循环。否则,您可能会在下一次迭代中将其设置回 false。
  • @KaleJoe 在这种情况下,要么放置 break; 语句,要么将 isValidCoordinate = true 替换为 return true; 您甚至可以摆脱布尔变量。
  • 我尝试在 isValidCoordinate = true; 之后放置 break在循环中,但仍然是错误的。
  • @KaleJoe 好吧,我刚刚注意到你有嵌套循环。 break 只会跳出内循环,所以还不够。也许您应该只返回 true 而不是将 true 分配给变量。
【解决方案3】:
import java.util.regex.*;

public static boolean validCoordinate(String coordinate, int dimension)
{
    Pattern p = Pattern.compile("[A-Z]+");
    Matcher m = p.matcher(coordinate);
    return m.matches();
}

【讨论】:

  • 虽然这可能会实现 OP 的编程目标,但它绝不会解决他们提出的问题。
  • 如果您提供解释为什么这是首选解决方案并解释它是如何工作的,它会更有帮助。我们想要教育,而不仅仅是提供代码。
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多