我有以下方法可以标准化给定的XML标签名称:

public static String normaliseTagName(String tagName) {
    // Return a given empty tag name.
    if (tagName.length() == 0) {
        return tagName;
    }

    // Replace invalid start.
    if (isInvalidXMLStart(tagName.charAt(0))) {
        tagName = XML_REPLACEMENT + tagName;
    }

    // Replace invalid characters.
    StringBuilder normalised;
    boolean invalidFound = false;
    for (int i = 0; i < tagName.length(); i++) {
        if (isInvalidXMLChar(tagName.charAt(i))) {
            if (!invalidFound) {
                normalised = new StringBuilder(tagName.substring(0, i));
                invalidFound = true;
            }
            normalised.append(XML_REPLACEMENT); // COMPILER ERROR
        } else if (invalidFound) {
            normalised.append(tagName.charAt(i)); // COMPILER ERROR
        }
    }

    return invalidFound ? normalised.toString() : tagName; // COMPILER ERROR
}

在确定要使用StringBuilder normalised之前,我不想对其进行初始化。换句话说,我只想在发现无效的XML字符时对其进行初始化。

我在指示的位置出现The local variable normalised may not have been initialized错误,并且对为什么编译器告诉我normalised显然从未未经初始化的情况感到困惑。
  • 我是否缺少某些内容?或者在这种情况下,编译器无法确定StringBuilder normalised的初始化路径吗?
  • 如果无法避免此编译错误,如何修改此代码,以便仅在需要时才初始化StringBuilder

  • 谢谢!

    最佳答案

    您需要显式初始化本地变量:

    StringBuilder normalised = null;
    

    ... 要么 ...
    StringBuilder normalised = new StringBuilder();
    

    ...在引用它之前。

    在代码初始化之前,您的代码中的某些路径会引用normalised:
    normalised.append(...
    

    局部变量不会像实例字段那样自动初始化。

    10-07 16:14