Java变量是否是必需的

Java变量是否是必需的,java,Java,当我学习编程语言时,老师说我必须初始化,否则空指针会犯很大的错误。当我建立JDBC连接数据库时,Intelij IDEA建议当ResultSet变量的定义初始化为null时,初始化是多余的。为什么其他人没有出现?有时把一句话分成两句也是明智的。初始化、分配 public List<Message> getMesssages() { Connection conn = null; Statement statement = null; ResultSet re

当我学习编程语言时,老师说我必须初始化,否则空指针会犯很大的错误。当我建立JDBC连接数据库时,Intelij IDEA建议当ResultSet变量的定义初始化为null时,初始化是多余的。为什么其他人没有出现?有时把一句话分成两句也是明智的。初始化、分配

public List<Message> getMesssages() 
{
    Connection conn = null;
    Statement statement = null;
    ResultSet result = null;
    SQLException ex = null;
    List<Message> messages = null;
    try
    {
        conn = DriverManager.getConnection(jdbcUrl, username, password);
        statement = conn.createStatement();
        result = statement.executeQuery("SELECT * FROM departments");
        messages = new ArrayList<Message>();

        while (result.next()){
            Message message = new Message();
            message.setDept_no(result.getString("dept_no"));
            message.setDept_name(result.getString("dept_name"));
            messages.add(message);
        }

    } catch (SQLException e) {
        ex = e;
    } finally {
        if (statement != null){
            try {
                statement.close();
            } catch (SQLException e) {
                if (ex == null){
                    ex = e;
                }
            }
        }

        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                if (ex == null){
                    ex = e;
                }
            }
        }

        if (ex != null){
            throw new RuntimeException(ex);
        }
    }

    return messages;
}
我看了他的建议,但还是不明白

IDE告诉您,ResultSet结果不能取消初始化并在代码中使用。但其他变量在某些情况下无法初始化,因此必须将默认值设置为null

另外,让我提供另一种代码方法。我认为这可能更具可读性,并且不会出现自动关闭资源的问题:

public List<Message> getMesssages() throws SQLException {
    try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
         Statement statement = conn.createStatement()) {
        ResultSet result = statement.executeQuery("SELECT * FROM departments");
        List<Message> messages = new ArrayList<>();

        while (result.next()) {
            Message message = new Message();
            message.setDept_no(result.getString("dept_no"));
            message.setDept_name(result.getString("dept_name"));
            messages.add(message);
        }

        return messages;
    }
}

这里的问题是什么?您应该在这里增加更多的清晰度。结果的初始化是多余的,因为您在已经使用它的唯一块中初始化它。现在编写代码的方式是无法取消初始化的,您甚至可以将声明本身移动到try块中