似乎没有读取名为“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将其视为编码。)
答案 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
。