尝试将控制台输出保存在文本文件中时获取NullPointerException

时间:2019-07-25 08:41:16

标签: java jdbc

有人可以在这里提供帮助吗,我正在尝试将控制台输出保存到文本文件中,并且出现NullPointerException错误。请提出我在这里做错了什么。还有没有一种方法可以为每次运行创建一个新的文本文件?

提前感谢:

import java.io.*;  
import java.sql.*;  

public class RetrieveFile {  
    public static void main(String args[]) throws Exception {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@tkdp2gpsdbc03-vip.hk.hsbc:35120/GPSEAU_TAF", "gppeareadu", "F4nt4na");

            PreparedStatement ps = con.prepareStatement("select * from MSG_FEES where MID='1961108001406E00'");
            ResultSet rs = ps.executeQuery();

            try {
                printResultColumns(rs);
            } catch (SQLException e) {
                System.err.println(e.getMessage());
            }

            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void printResultColumns(ResultSet resultSet) throws SQLException, IOException {
    ResultSetMetaData rsmd = resultSet.getMetaData();
    int columnCount = rsmd.getColumnCount();

    while (resultSet.next()) {
        // you get a single result row in here, not the entire ResultSet
        for (int i = 1; i <= columnCount; i++) {
            switch (rsmd.getColumnType(i)) {
            case Types.VARCHAR:
            case Types.LONGVARCHAR:
            case Types.CHAR:
                System.out.println(resultSet.getString(i));
                break;
            case Types.DOUBLE:
                System.out.println(resultSet.getDouble(i));
                break;
            case Types.INTEGER:
                System.out.println(resultSet.getInt(i));
                break;
            case Types.DATE:
                System.out.println(resultSet.getDate(i).toString());
                break;
            case Types.TIMESTAMP:
                System.out.println(resultSet.getTimestamp(i).toString());
                break;
            case Types.BOOLEAN:
                System.out.println(resultSet.getBoolean(i));
                break;
            case Types.DECIMAL:
            case Types.NUMERIC:
                System.out.println(resultSet.getBigDecimal(i));
                break;
            default:
                //System.out.println(rsmd.getColumnClassName(i)



            }
        }
    }


StringBuilder record = new StringBuilder();
while (resultSet.next()) {
    if (record.length() > 0) record.append("\n");
    for (int i=1; i < columnCount; ++i) {
        if (i > 1) record.append(", ");
        record.append(resultSet.getInt(i));
    }
}
try {
    String filename = "C:\\Users\\45060849\\Desktop\\test1.txt";
    BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
    char[] str = null;
    writer.write(str);
    writer.close();
}
catch (IOException e) {
    // handle exception
}

}     }

请为以下代码找到以下日志文​​件:- 请为以下代码找到以下日志文​​件:-

java.lang.NullPointerException
    at java.io.Writer.write(Writer.java:127)
    at RetrieveFile.printResultColumns(RetrieveFile.java:76)
    at RetrieveFile.main(RetrieveFile.java:14)
Picked up JAVA_TOOL_OPTIONS: -Duser.home=C:\Users\123

2 个答案:

答案 0 :(得分:0)

您的错误在以下行:

char[] i = null;
String data = String.valueOf(i);

方法String.valueOf()断言给定的任何char数组都不为null,否则抛出NullPointerException。您需要在调用char[]之前设置此String.valueOf()的值,否则错误将继续存在。

注意:您的代码还有其他错误,即使您修复此错误,其他事情也可能失败。考虑阅读此页面,其中详细介绍了如何在Java中完成文件IO: https://docs.oracle.com/javase/tutorial/essential/io/

答案 1 :(得分:0)

您当前正在尝试将null from collections import Counter result = dict(Counter(words)) 写入文本文件,因此存在null指针异常。假设您只想写出每条记录,可以尝试:

char[]

这里的技巧是仅使用StringBuilder record = new StringBuilder(); while (resultSet.next()) { if (record.length() > 0) record.append("\n"); for (int i=1; i < columnCount; ++i) { if (i > 1) record.append(", "); record.append(resultSet.getObject(i)); } } try { String filename = "C:\\Users\\2345\\Desktop\\test2.txt"; BufferedWriter writer = new BufferedWriter(new FileWriter(fileName)); writer.write(record); writer.close(); } catch (IOException e) { // handle exception } 来获取每一行中每一列的值。然后,只需依靠ResultSet#getObject()方法来呈现实际值。