A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林其荣 中级黑马   /  2013-1-18 16:55  /  1947 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-19 12:09 编辑

我这段代码是想打印出一个文件夹下所有文件和文件夹的名字。如果文件夹下还有文件,则递归调用该函数,打印该子文件夹下的文件和文件夹的名字,直到最后只剩文件为止。
代码如下:

import   java.io.File;

public   class   Test   {

             public   Test()   {
             }
             public   void   readFolderByFile(String   filePath)
          {
                      File   file   =   new   File(filePath);
                      File[]   tempFile   =   file.listFiles();
                      for(int   i   =   0;i <tempFile.length;i++)
                      {
                            if(tempFile.isFile())
                            {
                                        System.out.println( "File   :    "+tempFile.getName());
                               }
                               if(tempFile.isDirectory())
                               {
                                           String   subDirectory   =   tempFile.getName();
                                           System.out.println( "Directory   :    "+subDirectory);
                                           readFolderByFile(subDirectory);   //递归调用在此
                             }
                         }   
          }
           
          public   static   void   main(String   Args[])
          {
                  Test   test   =   new   Test();
                  test.readFolderByFile( "E:\\shared ");
          }
              
}
编译通过。运行打印出第一个文件的名字后抛出异常 请问我代码哪错了

点评

在给你技术分前,我很犹豫的。在这个版块鼓励大家踊跃提问,但是会结合你当前技术情况和你提问的质量。  发表于 2013-1-19 11:59

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
将String   subDirectory   =   tempFile[i].getName(); 改成

String   subDirectory   =   tempFile[i].toString();即可。

简单分析:
在程序适当位置加入以下代码
System.out.println(subDirectory+"....."+tempFile[i].toString());
发现一个获得的是相对路径,后面这个是绝对路径。这说明,判断之后需要传回绝对路径。
你用的是subDirectory也就是tempFile[i].getName();
希望对你有帮助,更详细的说明需要再查Api等资料了。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
  1. if(tempFile[i].isFile())           //这里应该先验证是不是目录也就是isDirectory()如果是就递归,第二次再验证是不是文件                          {
  2.                                         System.out.println( "File   :    "+tempFile[i].getName());
  3.                                }
  4.                                if(tempFile[i].isDirectory())
  5.                                {
  6.                                            String   subDirectory   =   tempFile[i].getName();
  7.                                            System.out.println( "Directory   :    "+subDirectory);
  8.                                            readFolderByFile(subDirectory);   //递归调用在此
  9.                              }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先楼主的代码
  for(int   i   =   0;i <tempFile.length;i++)
                      {
                            if(tempFile[i].isFile())
                            {
                                        System.out.println( "File   :    "+tempFile[i].getName());
                               }
                               if(tempFile[i].isDirectory())
                               {
                                           String   subDirectory   =   tempFile[i].getName();
                                           System.out.println( "Directory   :    "+subDirectory);
                                           readFolderByFile(subDirectory);   //递归调用在此
                             }
                         }   
两个if会降低运行效率,不是目录就是文件用if else即可,其次你的判断顺序也不对,面向对象肯定是先判断是否是目录再者是否是文件
String   subDirectory   =   tempFile[i].getName();
System.out.println( "Directory   :    "+subDirectory);
readFolderByFile(subDirectory);   //递归调用在此
这样写很没有必要,可改为:
System.out.println( "Directory   :    "+tempFile[i].getName(););
readFolderByFile(tempFile[i]);   //递归调用在此

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
两个if的先后顺序并不影响该程序的运行。
楼主的代码  编译运行后的异常是  空指针异常。

楼主的方法接收的是String,而不是File对象。所以传入tempFile[i]是不行的。
查API可以知道getName()返回的是路径名名称序列中的最后一个名称。
所以当判断是否是目录后,楼主的代码里subDirectory传给方法时,传的是路径名名称序列中的最后一个名称。
实际需要的却是绝对路径。
所以,我在上面的回答里提出的修改,经过运行验证后是可行的。
具体的验证也可以通过我上面提到的加一行代码做比较验证。


评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 arno942 于 2013-1-18 22:18 编辑
  1. import java.io.File;

  2. public class HashCodeDemo {

  3.         public static void main(String Args[]) {
  4.                 File file = new File("E:\\1208");
  5.                 readFolderByFile(file);
  6.         }

  7.         public static void readFolderByFile(File file) {
  8.                 //把你的对象去掉 ,传递 File对象 ,不要传 字符串
  9.                 File[] tempFile = file.listFiles();

  10.                 for (int i = 0; i < tempFile.length; i++) {

  11.                         if (tempFile[i].isFile()) {
  12.                                 System.out.println("File :  " + tempFile[i].getName());
  13.                         } else {
  14.                                         readFolderByFile(tempFile[i]);
  15.                                 //上面判断过了,如果是文件就输出, 如果到这里肯定是文件夹  ,那就递归,等到没文件夹了 跳出                             
  16.                                
  17.                                 //你的那个程序这里递归出的问题,
  18.                                 //你传的是递归前获得getName();它是名称,不是路径,看下这个方法是怎么说的吧,
  19.                                 //getName();返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。
  20.                                 //你把名称在给构造方法File(String pathname)
  21.                                 //通过将给定路径名字符串转换为抽象路径名来创建一个新实例。如果给定字符串是空字符串,那么结果是空抽象路径名
  22.                                 //pathname - 路径名字符串
  23.                                 //抛出
  24.                                 //NullPointerException
  25.                                 //- 如果 pathname 参数为 null
  26.                                 //知道怎么抛出的异常了吗?
  27.                         }
  28.                 }
  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马