Java中空赋值的优点是什么?

时间:2011-02-22 19:53:51

标签: java

我看到很多像这样的代码:

SomeObject someObject = null;

try{

   someObject = ObjectFactory.createSomeObject();
   ...

与此相比,这样做有什么好处:

SomeObject someObject = ObjectFactory.createSomeObject();

6 个答案:

答案 0 :(得分:8)

这是一个常用的习惯用法,你必须用null初始化连接,因为Java只支持类成员的初始化,在这个范围内你必须用null初始化它,因为ConnectionFactory.create()也许也抛出异常。

您可以使用它来扩大变量的范围并在以后使用它,例如关闭连接句柄。

Connection connection = null;

try {
   connection = ConnectionFactory.create();

   [...]

   // More code which probably causes an exception

} catch(Exception e) {
   // Handle the exception
} finally {
    if(connection != null) {
      // Cleanup and close resources later
      connection.close()
    }
}

如果初始化catch块中的连接,则对于finally块或以下代码不可见。

答案 1 :(得分:3)

创建需要销毁的对象或需要处理的资源时,这是一种常见的模式。例如,使用数据库连接:

Connection        connection = null;
PreparedStatement statement  = null;

try {
    connection = getConnection();
    statement  = connection.prepareStatement("SELECT * FROM users");

    // ...
}
catch (SQLException exception) {
    // Handle error.
}
finally {
    if (statement  != null) statement .close();
    if (connection != null) connection.close();
}

如果您声明try块内的对象,则它们不能在finally内引用,因为它具有不同的范围。声明必须在try之外,但是赋值必须在内部,以便可以捕获初始化期间的异常。

close()调用必须在finally块内完成,以确保释放数据库资源,无论数据库调用是否成功。

答案 2 :(得分:1)

它可能与someObject-variable的范围(可见性)有关,因此稍后可以在try-catch -block之外使用该变量。

答案 3 :(得分:1)

这是一个不明智的小舞蹈人与null一起玩,试图将try - finallytry - catch合并。它常常伴随着错误(NPE,在不开心的情况下没有关闭所有内容,释放未获得的资源等等 - 人们所以创造性地使用邋code的代码中的错误)。将try的两种不同形式分开,可能分为不同的方法要好得多。与try - catch - finally组合不同,finally应在catch范围内。

try {
    final SomeObject someObject = ObjectFactory.createSomeObject();
    try {
        ...
    } finally {
        someObject.dispose();
    }
} catch (SomeException exc) {
    throw AppropriateToTheCallerException(exc);
    // or printf
}

在JDK7中,假设SomeObject实现AutoCloseable,您可以编写

try (final SomeObject someObject = ObjectFactory.createSomeObject()) {
    ...
} catch (SomeException exc) {
    throw AppropriateToTheCallerException(exc);
    // or printf
}

请注意,隐藏的“finally”位于catch之前。我通常会建议分离资源和异常处理。

答案 4 :(得分:0)

如果要在try / catch / finally块中处理的ObjectFactory.createSomeObject()方法中抛出异常,这是退出try / catch / finally块后可以使用someObject的唯一方法。

答案 5 :(得分:0)

使用try-catch-finally块,您可以更轻松地处理发生的任何异常。

您无法在try块中声明变量并在该块之外访问它。所以,你在任何块之外声明它。当您想要在finally块中释放资源时,这尤其有用。