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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 光sail 中级黑马   /  2012-4-29 18:46  /  2685 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 光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)
大家帮帮忙看看

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

9 个回复

倒序浏览
可以在showFile里先验证下传进来的参数dir:
if(dir==null || !dir.exists())
     reurn;

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
空指针异常嘛,传进来的dir要么不存在,要么为空,sb.delete(0,sb.length());这句代码执行后容器中没有内容,创建的对象为空,所以就空指针异常了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 贾联国 于 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);



}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 贾联国 于 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:47 编辑
贾联国 发表于 2012-4-29 20:02
按照我下面的操作,LZ的这段代码写的还是正确的~   只是代码写错了 ,异常什么的不用理会~
public static v ...
而且显示的文件不全

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

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

话说代码到我这里运行很完整,也没有异常啊
回复 使用道具 举报
光sail 发表于 2012-4-29 20:28
而且显示的文件不全

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

千万不要说你读的是C盘
回复 使用道具 举报
贾联国 发表于 2012-4-29 21:08
千万不要说你读的是C盘

没,读e盘,明天再试试看
回复 使用道具 举报
贾联国 发表于 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)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马