对拒绝合作的Java代码进行故障排除
名为“code”的字符串似乎无法读取。为什么会这样?我该如何修复它 我的代码(导致问题的代码段):对拒绝合作的Java代码进行故障排除,java,string,Java,String,名为“code”的字符串似乎无法读取。为什么会这样?我该如何修复它 我的代码(导致问题的代码段): 字符串代码; 对于(int z=0;z如果x为零,code会有什么值?答案是它根本没有值(甚至不是null)。如果愿意,您可以将其初始化为空字符串: String code = ""; 您已经创建了一个引用,但从未对其进行过初始化。请将第一行更改为来初始化code String code = "" Edit:Zavior指出,您可以从缓存中提取初始化的字符串,而不是为新字符串分配空间 但是,为
字符串代码;
对于(int z=0;z如果x
为零,code
会有什么值?答案是它根本没有值(甚至不是null
)。如果愿意,您可以将其初始化为空字符串:
String code = "";
您已经创建了一个引用,但从未对其进行过初始化。请将第一行更改为来初始化code
String code = ""
Edit:Zavior指出,您可以从缓存中提取初始化的字符串,而不是为新字符串分配空间
但是,为什么要将temp赋值给code,然后将code赋值给temp加上其他值呢?它可以设置为code=code+ca
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!!");
}
}
布尔恐慌;
对于(int i=0;i<10;i+=2){
如果(i%2==1&&panic){//这里有编译错误
System.out.println(“Panic!!”);
}
}
明确的赋值规则(在JLS中指定)规定,panic
在指定的点上没有明确初始化。对于理解形式化方法基本知识的人来说,证明i%2==1
将始终是false
,这是一件简单的事情。但是,编译器不能。(即使可能,根据JLS规则,代码仍然存在错误。)乍一看,您的第一个循环将不起作用。您正在将0
添加到z
中。除非您没有向我们显示有关“code”的内容,否则错误看起来是不言自明的。是的,我知道z+0不起任何作用。但是,在循环的后面,我降低了X。第一个循环也与任何输入字符串无关。@azulflame do对于输入字符串中的每个字符,可以降低x,因为可以通过将z的条件设置为小于string.length.for(int z;z
这是一个片段,不是整个程序,但我想我明白你的意思了。请给我一点时间来测试一下。谢谢,只是你提到的“x”让我很困惑。我正在程序的其他地方使用它(int x=str.length();)为什么我不能对我自己的问题的答案投上一票?你应该被允许,即使你没有15个代表同意,堆栈溢出?我指的是x
,因为你有条件z=0
和x@KirkWoll他只有不到15个声誉,不能投上一票。但他可以接受。因为我做事迂回s(有时我只是不希望人们理解整个程序)而不是使用String code=new String(),只需使用String code=“”;
String code = ""
boolean panic;
for (int i = 0; i < 10; i += 2) {
if (i % 2 == 1 && panic) { // compilation error here
System.out.println("Panic!!");
}
}