对拒绝合作的Java代码进行故障诊断

时间:2012-05-20 22:35:25

标签: java string

似乎没有读取名为“code”的字符串。为什么这样,我该如何解决?

我的代码(导致问题的代码段):

String code;
for(int z = 0; z<x;z= z+0) // Repeat once for every character in the input string remaining
{
    for(int y=0;y<2;y++) //Repeat twice
    {
        c = (char)(r.nextInt(26) + 'a'); //Generate a random character (lowercase)
        ca = Character.toString(c);
        temp = code;
        code = temp + ca; //Add a random character to the encoded string
    }

我的错误报告:

--------------------Configuration: <Default>--------------------
H:\Java\Compiler.java:66: variable code might not have been initialized
        temp = code;
               ^
1 error

Process completed.

(我正在使用JCreator 5.00,Java 7。)

(是的,错误报告看起来很愚蠢,但Stack Overflow将其视为编码。)

3 个答案:

答案 0 :(得分:8)

如果code为零,x会有什么价值?答案是它根本就没有价值(甚至不是null)。如果您愿意,可以将其初始化为空字符串:

String code = "";

答案 1 :(得分:4)

Java要求在使用其值之前初始化每个变量。在这个例子中,有一个相当明显的例子,在分配之前使用变量。 Java语言规范(JLS)不允许这样做。 (如果确实如此,程序的行为将是不可预测的,包括......可能...... JVM崩溃。)

在其他情况下,编译器会抱怨实际上有问题的变量总是被初始化(或者看起来如此)。而不是“理解”您的代码,或尝试派生初始化的逻辑证明,编译器遵循指定的过程来确定变量是否明确分配。这个过程本质上是保守的,它给出的答案是“它被初始化”或“它可能没有被初始化”。因此编译错误消息的措辞。

这是一个编译器会抱怨的例子,即使在使用前初始化变量是“显而易见的”:

boolean panic;
for (int i = 0; i < 10; i += 2) {
    if (i % 2 == 1 && panic) { // compilation error here
        System.out.println("Panic!!");
    }
}

明确的赋值规则(在JLS中指定)表示panic未明确在所指示的位置初始化。对于理解正式方法基础知识的人来说,证明i % 2 == 1永远是false是一件简单的事情。但是,编译器不能。 (即使可能,代码在JLS规则下仍然存在错误。)

答案 2 :(得分:2)

您已经创建了一个引用,但是您从未初始化它。通过将第一行更改为

来初始化code
String code = ""

编辑:Zavior指出您可以从缓存中提取初始化字符串,而不是为新缓存分配空间。

但是为什么要为代码分配temp然后将代码添加到temp加上其他内容呢?它可以设置为code = code + ca