0

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

4

5 回答 5

8

不要低估使用带有循环的花括号。这是你的代码:

while((str=din.readLine())!=null)
    System.out.println(str);
    writeTextFile("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt",str);
    din.close();

这里, onlySystem.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();

你应该没事。

于 2013-04-16T14:41:15.570 回答
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循环完成后运行- when stris null


道德是始终正确缩进您的代码
使用你的IDE来自动格式化你的代码,这样的问题会更加明显。

或者,切换到对空格敏感的语言,例如 Python。

于 2013-04-16T14:40:07.633 回答
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();
于 2013-04-16T14:46:13.233 回答
0

另外,为避免以后出现更多麻烦:

您将传递fileName给 thrwriteTextFile方法,但从不使用它。所以不要这样做:

new FileWrite("/home/newlabuser/workspace/CopyFileDemo/src/demo1.txt");

你应该这样做:

new FileWriter(fileName);

叶戈尔已经回答了最初的问题。

于 2013-04-16T14:50:25.427 回答
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();
于 2013-04-16T14:50:43.533 回答