黑马程序员技术交流社区
标题:
递归调用函数问题求解
[打印本页]
作者:
林其荣
时间:
2013-1-18 16:55
标题:
递归调用函数问题求解
本帖最后由 张向辉 于 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-18 17:23
将String subDirectory = tempFile[i].getName(); 改成
String subDirectory = tempFile[i].toString();即可。
简单分析:
在程序适当位置加入以下代码
System.out.println(subDirectory+"....."+tempFile[i].toString());
发现一个获得的是相对路径,后面这个是绝对路径。这说明,判断之后需要传回绝对路径。
你用的是subDirectory也就是tempFile[i].getName();
希望对你有帮助,更详细的说明需要再查Api等资料了。
作者:
txl
时间:
2013-1-18 17:38
if(tempFile[i].isFile()) //这里应该先验证是不是目录也就是isDirectory()如果是就递归,第二次再验证是不是文件 {
System.out.println( "File : "+tempFile[i].getName());
}
if(tempFile[i].isDirectory())
{
String subDirectory = tempFile[i].getName();
System.out.println( "Directory : "+subDirectory);
readFolderByFile(subDirectory); //递归调用在此
}
复制代码
作者:
谢毅
时间:
2013-1-18 20:40
首先楼主的代码
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]); //递归调用在此
作者:
黑马伍哲沂
时间:
2013-1-18 21:06
两个if的先后顺序并不影响该程序的运行。
楼主的代码 编译运行后的异常是 空指针异常。
楼主的方法接收的是String,而不是File对象。所以传入tempFile[i]是不行的。
查API可以知道getName()返回的是路径名名称序列中的最后一个名称。
所以当判断是否是目录后,楼主的代码里subDirectory传给方法时,传的是路径名名称序列中的最后一个名称。
实际需要的却是绝对路径。
所以,我在上面的回答里提出的修改,经过运行验证后是可行的。
具体的验证也可以通过我上面提到的加一行代码做比较验证。
作者:
夏振博
时间:
2013-1-18 21:09
本帖最后由 arno942 于 2013-1-18 22:18 编辑
import java.io.File;
public class HashCodeDemo {
public static void main(String Args[]) {
File file = new File("E:\\1208");
readFolderByFile(file);
}
public static void readFolderByFile(File file) {
//把你的对象去掉 ,传递 File对象 ,不要传 字符串
File[] tempFile = file.listFiles();
for (int i = 0; i < tempFile.length; i++) {
if (tempFile[i].isFile()) {
System.out.println("File : " + tempFile[i].getName());
} else {
readFolderByFile(tempFile[i]);
//上面判断过了,如果是文件就输出, 如果到这里肯定是文件夹 ,那就递归,等到没文件夹了 跳出
//你的那个程序这里递归出的问题,
//你传的是递归前获得getName();它是名称,不是路径,看下这个方法是怎么说的吧,
//getName();返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,则返回空字符串。
//你把名称在给构造方法File(String pathname)
//通过将给定路径名字符串转换为抽象路径名来创建一个新实例。如果给定字符串是空字符串,那么结果是空抽象路径名
//pathname - 路径名字符串
//抛出
//NullPointerException
//- 如果 pathname 参数为 null
//知道怎么抛出的异常了吗?
}
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2