我在这个程序中遇到异常。我试图做一些改变,但它仍然无法正常工作。我正在尝试将数据从demo.txt写入demo1.txt,但它给出了NullPointerException
。我在这里做错了什么?
import java.io.*;
class CopyFile{
public static void main(String[] args){
String str = null ;
try {
File f = new File("/home/newlabuser/workspace/CopyFileDemo/src/demo.txt");
if(f.exists())
{
if(f.canRead())
{
FileInputStream fin = new FileInputStream(f);
BufferedInputStream bin = new BufferedInputStream(fin);
DataInputStream din = new DataInputStream(bin);
while((str=din.readLine())!=null)
System.out.println(str);
writeTextFile("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt",str);
din.close();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void writeTextFile(String fileName, String s) {
FileWriter output;
try {
output = new FileWriter("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt");
BufferedWriter writer = new BufferedWriter(output);
writer.write(s);
writer.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
显示java.lang.NullPointerException
在java.io.Writer.write(Writer.java:140)
在CopyFile.writeTextFile(CopyFile.java:37)
在CopyFile.main(CopyFile.java:21)
答案 0 :(得分:8)
你在while
循环的主体周围缺少大括号。
因此,Java会像这样解析它:
while((str=din.readLine())!=null) {
System.out.println(str);
}
writeTextFile("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt",str);
din.close();
因此,writeTextFile()
行仅在while
循环完成之后运行 - 当str
为null
时。{/ p>
道德是始终正确缩进代码 使用IDE自动格式化代码,这种问题会更加明显。
或者,切换到对空格敏感的语言,例如Python。
答案 1 :(得分:8)
不要低估使用带花环的花括号。这是你的代码:
while((str=din.readLine())!=null)
System.out.println(str);
writeTextFile("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt",str);
din.close();
这里,只有System.out.println(str)
将在循环中运行,下一行将在循环退出后执行,显然str在这里将是null
。因此,当您将null
传递给BufferedWriter's
write()
方法时,您会获得NullPointerException
。修复您的代码:
while((str=din.readLine())!=null) {
System.out.println(str);
writeTextFile("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt",str);
}
din.close();
你应该没事。
答案 2 :(得分:0)
试试这个:
File fdir = new File("/home/newlabuser/workspace/CopyFileDemo/src");
FileWriter file = new FileWriter(new File(fdir,"demo1.txt"));
file.write(new Scanner(new File(fdir,"demo.txt")).useDelimiter("\\Z").next());
file.close();
答案 3 :(得分:0)
另外,为了避免以后出现更多麻烦:
您将fileName
传递给thr writeTextFile
- 方法,但从不使用它。
所以不要这样做:
new FileWrite("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt");
你可以这样做:
new FileWriter(fileName);
Egor已经回答了原来的问题。
答案 4 :(得分:0)
这可能会出错:
while((str=din.readLine())!=null) {
System.out.println(str);
writeTextFile("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt",str);
din.close();
}
您在每个循环中关闭din
。也许它应该在循环之外。
这可能会出错:
while((str=din.readLine())!=null) {
System.out.println(str);
writeTextFile("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt",str);
}
din.close();