3

名为“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 将其读取为编码。)

4

3 回答 3

7

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

String code = "";
于 2012-05-20T22:38:36.303 回答
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 规则,代码仍然是错误的。)

于 2012-05-20T22:52:26.417 回答
2

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

String code = ""

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

但是,为什么要将 temp 分配给 code,然后将 code 分配给 temp 以及其他内容?可以设置为code = code + ca

于 2012-05-20T22:39:19.500 回答