Java StringBuilder循环:局部变量可能尚未初始化

Java StringBuilder循环:局部变量可能尚未初始化,java,compiler-errors,initialization,stringbuilder,Java,Compiler Errors,Initialization,Stringbuilder,我使用以下方法规范化给定的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(

我使用以下方法规范化给定的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
}
公共静态字符串normaliseTagName(字符串标记名){
//返回给定的空标记名。
如果(标记名.length()==0){
返回标记名;
}
//替换无效的开始。
if(isInvalidXMLStart(标记名.charAt(0))){
标记名=XML_替换+标记名;
}
//替换无效字符。
正常化;
布尔值invalidFound=false;
对于(int i=0;i
在确定使用之前,我不想初始化
StringBuilder normalized
。换句话说,我只想在发现无效的XML字符时初始化它

我得到
标准化的局部变量可能没有初始化
错误,我不明白为什么编译器告诉我当
标准化时
显然从未在未初始化的情况下使用

  • 在这种情况下,我是否遗漏了什么,或者编译器无法确定标准化的
    StringBuilder的初始化路径
  • 如果无法避免此编译错误,如何修改此代码,以便仅在需要时初始化
    StringBuilder

  • 谢谢

    您需要显式初始化局部变量:

    StringBuilder normalised = null;
    
    。。。或者

    StringBuilder normalised = new StringBuilder();
    
    。。。在引用它之前

    代码引用中的某些路径在初始化之前已标准化:

    normalised.append(...
    

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

    您需要显式初始化局部变量:

    StringBuilder normalised = null;
    
    。。。或者

    StringBuilder normalised = new StringBuilder();
    
    。。。在引用它之前

    代码引用中的某些路径在初始化之前已标准化:

    normalised.append(...
    

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

    不能使用未初始化的局部变量。至少您已经将其设置为
    null
    。您不能使用未初始化的局部变量。至少您已经将其设置为
    null
    本地变量不会像实例字段那样自动初始化。
    我不知道!因此,如果我使用
    StringBuilder normalized=null
    ,我将初始化指向null的指针,而不实际在内存中创建任何内容(这是我想要的),对吗?@AlexisLeclerc它将使用
    null
    值初始化引用。所以它确实在内存中创建了一些东西(堆栈):)但是是的,这就是你想要的。我明白了。我假设局部变量与实例字段具有相同的初始化行为。我今天学到了一些东西,谢谢!:)<代码>局部变量不会像实例字段那样自动初始化。
    我不知道!因此,如果我使用
    StringBuilder normalized=null
    ,我将初始化指向null的指针,而不实际在内存中创建任何内容(这是我想要的),对吗?@AlexisLeclerc它将使用
    null
    值初始化引用。所以它确实在内存中创建了一些东西(堆栈):)但是是的,这就是你想要的。我明白了。我假设局部变量与实例字段具有相同的初始化行为。我今天学到了一些东西,谢谢!:)