我在这个程序中遇到异常?

时间:2013-04-16 14:36:22

标签: java

我在这个程序中遇到异常。我试图做一些改变,但它仍然无法正常工作。我正在尝试将数据从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)

5 个答案:

答案 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循环完成之后运行 - 当strnull时。{/ 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();