日期:2014-05-20  浏览次数:20791 次

[新手提问]关于空引用异常 (昨天那个"io流复制文件贴"续)
-------------------
读文件输出到终端范例代码:
import   java.io.*;

class   readfile{
public   static   void   main(String[]   args)throws   IOException,ArrayIndexOutOfBoundsException{


File   f=new   File(args[0]);
if(f.exists()){
FileReader   Rfile=new   FileReader(f);
BufferedReader   r=new   BufferedReader(Rfile);
String   value=r.readLine();
while(true){
System.out.println(value);
if(value==null)   break;
value=r.readLine();
}
Rfile.close();
}
}
}
-------------------
因为初学,所以想参照以上代码我打算写个复制文件的代码加深理解应用
以下代码是昨天初贴完全没修改的
后来求教csdn各位以后终于完成了目的
但是后来细细研究这个错误代码的时候,两个> > > > > > 输出语句中间抛出的空引用异常是怎么抛出的一直都不明白line是因为引用了R1.我在//read   file1里面还有异常语句前用输出语句调试,输出的果然都是null   这是为什么啊?读文件部分明明是照示范代码写的.示范代码也调试过了,没错..
只关于此异常不探讨其他错误           求解!
------------------------------------------
初始代码:
import   java.io.*;

public   class   filetest{
public   static   void   main(String[]   args)   throws   IOException{

try{
File   f1=new   File(args[0]);
File   f2=new   File(args[1]);

//new   file1  
BufferedReader   stdin=new   BufferedReader(new   InputStreamReader(System.in));

FileWriter   writef1=new   FileWriter(f1);
BufferedWriter   w1=new   BufferedWriter(writef1);

//read   file1
System.out.println(f1);
FileReader   r1=new FileReader(f1);
BufferedReader   R1=new   BufferedReader(r1);
System.out.println(R1.readLine());


//write   file2
FileWriter   writef2=new   FileWriter(f2);
BufferedWriter   w2=new   BufferedWriter(writef2);

//这里f1.exists()的值也是1
if(!f1.exists())   {
f1.createNewFile();
System.out.println( "文件 "+args[0]+ "不存在!新建..\n请输入文件内容:\n ");

while(true){
System.out.print( "> ");
String   line   =stdin.readLine();
if(line!=null&&line.equals( "quit ")){
break;
}else   w1.write(line);
  }

}else{
System.out.println( "文件   "+args[0]+ "   已存在,复制到文件   "+args[1]+ "   中..   ");
}
f2.createNewFile();
while(true){
System.out.println(R1.readLine());
String   line=R1.readLine();
System.out.println( "> > > > ");
line=line.toUpperCase();
System.out.println( "> > > > ");
if(line!=null){
break;
}else w2.write(line);
}

w2.flush();
w2.close();
w1.flush();
w1.close();
writef2.close();
writef1.close();

  }catch(ArrayIndexOutOfBoundsException   e){
  System.out.println( "没有输入参数,或参数不匹配 ");
  }
}
}
----------------------------------------------------

------解决方案--------------------
若f1存在,FileWriter writef1=new FileWriter(f1);会清空f1的内容,如果想以追加方式打开f1则需要这样:FileWriter writef1=new FileWriter(f1, true);。f1为空则R1.readLine();返回null
若f1不存在,在调用w1.flush();之前要写入的数据都保存在缓冲区中并没有真正写入文件,此时f1是个空文件,R1.readLine();返回null
------解决方案--------------------