Java 局部变量在与异常一起使用之前未赋值
我很惊讶,如果我删除第一个赋值,我会得到一个编译错误。 代码如下所示:Java 局部变量在与异常一起使用之前未赋值,java,control-flow-graph,Java,Control Flow Graph,我很惊讶,如果我删除第一个赋值,我会得到一个编译错误。 代码如下所示: public void antlr(String fullyQualifiedFilename) { String path = null; try { path = new File(fullyQualifiedFilename).getParent(); if (path != null) { path = new File(path).getCanonicalPa
public void antlr(String fullyQualifiedFilename) {
String path = null;
try {
path = new File(fullyQualifiedFilename).getParent();
if (path != null) {
path = new File(path).getCanonicalPath();
}
} catch (IOException ioe) {
//...
}
if (path != null) {
int f;
}
}
我想删除变量初始化,只保留声明。事实上:
public void antlr(String fullyQualifiedFilename) {
String path;
try {
path = new File(fullyQualifiedFilename).getParent();
if (path != null) {
path = new File(path).getCanonicalPath();
}
} catch (IOException ioe) {
//...
}
if (path != null) {
int f;
}
}
我得到的错误如下:
Example.java:19,9:error:使用前未分配局部变量路径
有意义的是,第一个文件
构造函数只抛出未检查的异常NullPointerException
,而getParent()
不抛出任何已检查的异常。
因此,如果引发未经检查的异常,则第一个赋值始终是compute expect。
我的意思是,编译器拥有所有必要的信息,可以知道始终执行第一个赋值path=new File(fullyQualifiedFilename).getParent()
这就是我认为控制流图应该是的
我错了吗?我遗漏了什么吗?
第一个赋值路径=新文件(fullyQualifiedFilename)。getParent()总是被执行。
除非有异常并且不会有赋值。是的,可以引发的唯一异常被取消选中(并且编译器知道我在这个Try块中只处理IOException).我不知道你的意思;如果抛出异常,则该变量未初始化,并且在catch
块之后无法访问。请记住:Java编译器不可能知道您所知道的一切。它只是遵循一般规则,这些规则保持简单,以便语言规范不会简单地在复杂性上爆炸。有时,您只需要以编译器可以理解的方式编写代码,使用简单的规则:在这种情况下,只需使用null
@IdrissRiouak初始化即可,您可能认为编译器有足够的信息;但你真的读过吗?您能证明违反了这些规则吗?第一个分配路径=新文件(fullyQualifiedFilename)。getParent()始终被执行。
除非存在异常,否则将不进行分配。是的,可以引发的唯一异常将被取消选中(编译器知道我在这个Try块中只处理IOException。)。我不知道你的意思是什么;如果抛出异常,则变量未初始化,并且在catch
块之后无法访问。请记住:Java编译器不可能知道你所知道的一切。它只是遵循一般规则,这些规则保持简单,以便语言规范不会简单地在复杂性上爆炸。有时你只需要e以编译器可以理解的方式编写代码:在这种情况下,只需使用null
@IdrissRiouak初始化即可。您可能认为编译器有足够的信息;但您实际阅读了吗?您是否可以证明这些规则被违反了?