黑马程序员技术交流社区

标题: 为什么获取目录失败, [打印本页]

作者: 光sail    时间: 2012-4-29 18:46
标题: 为什么获取目录失败,
本帖最后由 光sail 于 2012-4-29 19:38 编辑

从键盘获取目录,列出目录下文件或者文件夹,包含子目录中的内容。也就是列出指定目录下所有内容。
  1. import java.io.File;
  2. import java.io.InputStream;

  3. public class ListFile {


  4. public static void main(String[] args) throws Exception
  5. {
  6. String s;
  7. InputStream in=System.in;
  8. StringBuilder sb=new StringBuilder();
  9. while (true){
  10. int ch=in.read();

  11. if(ch=='\r')
  12. continue;
  13. if(ch=='\n')
  14. {
  15. s = sb.toString();
  16. if("over".equals(s))
  17. break;

  18. sb.delete(0,sb.length());
  19. }
  20. else
  21. sb.append((char)ch);

  22. }



  23. File file=new File(sb.toString());
  24. showFile(file,0);
  25. }
  26. public static String getLevel(int Level){
  27. StringBuilder sb=new StringBuilder();
  28. sb.append("|--");
  29. for (int i = 0; i < Level; i++) {
  30. sb.insert(0, "| ");
  31. }
  32. return sb.toString();
  33. }
  34. public static void showFile(File dir,int level){
  35. System.out.println(getLevel(level)+dir.getName());
  36. level++;
  37. File [] files=dir.listFiles();
  38. for (int i = 0; i < files.length; i++) {
  39. if(files[i].isDirectory())
  40. showFile(files[i],level);
  41. else
  42. System.out.println(getLevel(level)+files[i]);
  43. }



  44. }
  45. }
复制代码
键盘录入结束后抛出个异常  Exception in thread "main" java.lang.NullPointerException
        at ListFile.showFile(ListFile.java:47)
        at ListFile.main(ListFile.java:33)
大家帮帮忙看看

作者: 罗旭维    时间: 2012-4-29 19:26
可以在showFile里先验证下传进来的参数dir:
if(dir==null || !dir.exists())
     reurn;


作者: 蒋亮    时间: 2012-4-29 19:44
空指针异常嘛,传进来的dir要么不存在,要么为空,sb.delete(0,sb.length());这句代码执行后容器中没有内容,创建的对象为空,所以就空指针异常了。
作者: 贾联国    时间: 2012-4-29 20:02
本帖最后由 贾联国 于 2012-4-29 20:04 编辑

按照我下面的操作,LZ的这段代码写的还是正确的~   只是代码写错了 ,异常什么的不用理会~
public static void main(String[] args) throws Exception

{

String s;

InputStream in=System.in;

StringBuilder sb=new StringBuilder();

while (true){

int ch=in.read();



if(ch=='\r')

continue;

if(ch=='\n')

{

s = sb.toString();

if("over".equals(s))



sb.delete(0,sb.length());
break;  //lz 把这break放前面
//后面的sb.delete(0,sb.length());根本运行不到啊
}

else

sb.append((char)ch);



}


作者: 贾联国    时间: 2012-4-29 20:08
本帖最后由 贾联国 于 2012-4-29 20:18 编辑
蒋亮 发表于 2012-4-29 19:44
空指针异常嘛,传进来的dir要么不存在,要么为空,sb.delete(0,sb.length());这句代码执行后容器中没有内容 ...


sb.delete(0,sb.length()); 这句代码虽然不是必须运行啊,但不是主要原因,会出现空指针异常了,调换break的顺序即可
作者: 光sail    时间: 2012-4-29 20:28
本帖最后由 光sail 于 2012-4-29 20:47 编辑
贾联国 发表于 2012-4-29 20:02
按照我下面的操作,LZ的这段代码写的还是正确的~   只是代码写错了 ,异常什么的不用理会~
public static v ...
而且显示的文件不全

按照你那样修改后能运行,敲回车就能运行,但不用over停止,等列完所有文件之后还是声明原来那个异常
作者: 贾联国    时间: 2012-4-29 20:50
光sail 发表于 2012-4-29 20:28
而且显示的文件不全

按照你那样修改后能运行,敲回车就能运行,但不用over停止,等列完所有文件之后还是声 ...

话说代码到我这里运行很完整,也没有异常啊
作者: 贾联国    时间: 2012-4-29 21:08
光sail 发表于 2012-4-29 20:28
而且显示的文件不全

按照你那样修改后能运行,敲回车就能运行,但不用over停止,等列完所有文件之后还是声 ...

千万不要说你读的是C盘
作者: 光sail    时间: 2012-4-29 21:49
贾联国 发表于 2012-4-29 21:08
千万不要说你读的是C盘

没,读e盘,明天再试试看
作者: 光sail    时间: 2012-5-2 16:23
贾联国 发表于 2012-4-29 20:50
话说代码到我这里运行很完整,也没有异常啊

键盘输入的是中文目录的时候,会报异常
E:\>java ListFile
E衣服
|--E??·?
Exception in thread "main" java.lang.NullPointerException
        at ListFile.showFile(ListFile.java:50)
        at ListFile.main(ListFile.java:36)




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