黑马程序员技术交流社区

标题: 很难解释的编译错误 [打印本页]

作者: 郑彬    时间: 2012-8-22 11:29
标题: 很难解释的编译错误
if(file.isDirectory()){
File[] files = file.listFiles();
}为什么这样写编译正确
if(file.isDirectory())
File[] files = file.listFiles();
这样写就编译错误呢?不就是少了大括号吗?也是条件语句啊。

作者: 黄敏    时间: 2012-8-22 11:39
把你的代码贴全了,才看的清楚啊
作者: 黑马王建伟    时间: 2012-8-22 11:57
估计你的if判断语句中并不是只有这一句吧,所以了,楼主这是故意的吗,再考我们?
作者: 陈鑫    时间: 2012-8-22 12:03
Java Language Specification 明确指出局部变量声明的作用范围是在一个块内,也可以理解为在{ }内。当你用if()后面不加大括号时,即意味着没有块而是一个单个语句,所以发生冲突。也就是说if后面不用大括号的话,就不能声明局部变量。
作者: 黄敏    时间: 2012-8-22 12:06
我认识是这样的
if(file.isDirectory())
         File[] files = file.listFiles();
jvm识别的才是if里面的语句
你要是这样写
if(file.isDirectory())
File[] files = file.listFiles();
jvm认为你这两平起平坐的,执行if这条语句发现后面没有语句体了也没有结束符;就提示错误了
你在书写规范上犯错;
为了不发生这样的错误,建议不管if体内有几条语句都有{}括起来,看着也好看。

作者: 黑马王建伟    时间: 2012-8-22 12:20

jvm认为你这两平起平坐的,执行if这条语句发现后面没有语句体了也没有结束符;就提示错误了

看了楼上的,我不知道怎么说了,简单说
  1.         public static void main(String[] args) {
  2.                 //就差一个制表符的位置,就不运行了吗?不是这样的,如果不加大括号的话,if就会自动识别并只识别且执行第一句,跟制表符无关,希望楼上把这个搞明白
  3.                 if(true)
  4.                 System.out.println("a");
  5.                 if(false)
  6.                 System.out.println("aa");
  7.                 if(true)
  8.                 System.out.println("b");
  9.                 if(false)
  10.                 System.out.println("bb");
  11.         }
复制代码

作者: 黑马王建伟    时间: 2012-8-22 12:21

为了不发生这样的错误,建议不管if体内有几条语句都有{}括起来,看着也好看。

不过楼上说的这句是没错的

作者: 黄敏    时间: 2012-8-22 12:33
黑马王建伟 发表于 2012-8-22 12:20
看了楼上的,我不知道怎么说了,简单说

你的if判断有意义吗?
作者: 黄敏    时间: 2012-8-22 12:33
黑马王建伟 发表于 2012-8-22 12:20
看了楼上的,我不知道怎么说了,简单说

可能是我说错了吧
作者: 李知伦    时间: 2012-8-22 12:39
问题应该出在如果不加大括号,编译器分不清File[] files的所属

可以改为提前定义File[] files = null;,这样你下面怎么写都没关系了
作者: 郑彬    时间: 2012-8-25 20:22
问题已经解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2