黑马程序员技术交流社区

标题: 代码出错,求分析 [打印本页]

作者: dkwoxihuan    时间: 2014-5-22 18:36
标题: 代码出错,求分析
private static File FindA(File dir)
        {
                File[] files = dir.listFiles();
                for(int x=0; x<files.length; x++)
                {
                        if(files[x].isDirectory())
                                FindA(files[x]);
                        else
                        {
                                if(files[x].toString().endsWith("A.java"))
                                {
                                        System.out.println("ddd:"+files[x]);
                                        return files[x];
                                }
                        }
                }
                return null;
        }

这个代码无法取到以A.java结尾的File  始终返回null, 求分析
还是不太懂递归和文件啊{:3_53:}
作者: 楚轩    时间: 2014-5-22 19:24
哥们,你这代码木有问题呀,我建议你在确认下你指定的文件夹dir下是否有"A.java"文件;
另外一个小小的建议就是老毕说的,当你找不着错了,就按代码先后顺序,写打印语句,判断错误发生在哪里,在纠正,俺也是新手,希望对你有所帮助。
作者: wangleixhlm    时间: 2014-5-22 19:28
当然有问题啊。FindA函数有返回值,你递归的时候没拿东西接收这个返回值。所以假如这个函数运行时,得到的第一个files[0]是个目录的话,它最后会执行return null。就导致在主函数接收时得到null。
要想不得到null,只有一种情况,就是dir下面只有一个文件,就是以A.java文件结尾。这样结果就会返回一个文件而不是NULL。

我帮你改了一下代码,这样写可以把dir下面所以目录包括子目录都找出以A.java结尾的文件。:
  1. import java.io.*;
  2. import java.util.*;

  3. class test8
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 File dir = new File("E:\\My Document");
  8.                     List<File> fl = new ArrayList<File>();
  9.                     FindA(dir,fl);
  10.                 Iterator<File> it = fl.iterator();
  11.                 while(it.hasNext())
  12.                         System.out.println(it.next());
  13.         }

  14.         private static void FindA(File dir,List<File> fl)
  15.         {
  16.                 File[] files = dir.listFiles();
  17.                 for(int x=0; x<files.length; x++)
  18.                 {
  19.                         if(files[x].isDirectory())
  20.                                 FindA(files[x],fl);
  21.                         else
  22.                         {
  23.                                 if(files[x].toString().endsWith("A.java"))
  24.                                 {
  25.                                         System.out.println("ddd:"+files[x]);
  26.                                         fl.add(files[x]);
  27.                                 }
  28.                         }
  29.                 }
  30.                
  31.         }
  32. }
复制代码

作者: GoodBoy123    时间: 2014-5-22 21:48
这是对文件操作的吗?
作者: 郭帅帅    时间: 2014-5-22 22:01
大哥,你的return null,写错地方了吧
作者: 楚轩    时间: 2014-5-22 23:01
wangleixhlm 发表于 2014-5-22 19:28
当然有问题啊。FindA函数有返回值,你递归的时候没拿东西接收这个返回值。所以假如这个函数运行时,得到的 ...

讨论:  若dir 中有以"A.java"结尾文件,得到的第一个files[0]是目录,确实会执行到return null;但程序会继续循环下去,当执行到以"A.java"结尾的文件时候,就会打印出该文件路径,所以还是能找出来带有"A.java"结尾的文件的,当然这个代码如果同一个目录下有多个"A.java"结尾的文件,则只会找着一个。
另:哥们你的修改也挺到位的,学习了!




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