Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 局部变量在与异常一起使用之前未赋值_Java_Control Flow Graph - Fatal编程技术网

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初始化即可。您可能认为编译器有足够的信息;但您实际阅读了吗?您是否可以证明这些规则被违反了?