在Java中处理未初始化的字符串
这是我作为家庭作业正在做的一个小程序的一部分:在Java中处理未初始化的字符串,java,object,compiler-errors,initialization,Java,Object,Compiler Errors,Initialization,这是我作为家庭作业正在做的一个小程序的一部分: public Exam maxGrade() { Node p = firstNode; int max = 0; String name; while (p!=null) { if (p.info.getGrade()>max) { max = p.info.getGrade(); name = p.info.getName();
public Exam maxGrade() {
Node p = firstNode;
int max = 0;
String name;
while (p!=null) {
if (p.info.getGrade()>max) {
max = p.info.getGrade();
name = p.info.getName();
}
p = p.next;
}
if (name==null)
return null;
else
return searchByName(name);
}
因此,当我继续编译时,编译器输出以下消息:
java:127:错误:变量名可能尚未初始化
if(name==null)
将第四行替换为:
String name = null;
现在,我可以从中看出一些逻辑。但我真的很想了解问题背后的工作原理。
我的意思是,如果编译器在代码中看到您正在使用某个变量,那么它检查该变量是否已初始化似乎是合理的,但我认为我没有做任何需要初始化该变量的事情
根据源代码,比如当我简单地声明我的字符串(或任何其他对象)变量“name”时,它已经指向null。那么,为什么仅仅检查该值是否为空就被视为异常呢?编译器会考虑错误吗?除了分配之外,我对未初始化的变量做了什么? 默认情况下,对象类型的字段初始化为NULL。默认情况下,数组成员也初始化为null 局部变量不是-它们必须显式初始化 这是一件好事。未初始化的变量通常表示错误 来自Java语言规范第4章: 局部变量(§14.4,§14.14)在使用前必须通过初始化(§14.4)或赋值(§15.26)明确给定一个值,其方式可以使用明确赋值规则(§16)进行验证
如果要对对象的值进行任何假设,编译器要求您将对象初始化为
null
。这只是一个(非常有用的)预防措施。附录:编译器无法检查程序的语义。即使您知道变量在首次使用之前已初始化,编译器也不能
考虑以下功能:
public boolean mod2(int i){
if(i % 2 == 0){
return true;
}
if(i % 2 != 0){
return false;
}
}
我们都知道这个方法总是返回true或false。相反,编译器不能确保总是有一个返回值,因为他必须知道只有这两个结果。因此,编译器将报告一个关于缺少return语句的错误。不,这不是它(您提供的链接)所说的。正如在接受的答案中所述,局部变量未初始化,因此出现错误。在众多其他变量中,可能存在重复。还请注意,如果不小心,null可能会导致某些字符串函数出现一些问题。因此,有时我会改为
String foo=“
。请注意,不能将对象初始化为null,但可以将对象类型的引用初始化为null。