Java / 数据库查询:空值或异常?

Java / Database-Query: null or Excpetion?

我有一个设计问题。在一个小型 java 应用程序中,我们有一些 类 用于访问 (mysql) 数据库。存在以下方法:

public Integer getPvpBotId(int userId);

它return是给定用户的 PvpBot 的 BotId。并非每个用户都有 PvpBot。 Bot 本身是一个相对较大的对象,所以我不喜欢加载完整的对象和 return 它,只是 id。

除非 PvpBot 存在,否则我应该 return null 吗? (我目前使用 Integer 而不是 int)

或者我应该抛出异常?

我问这个,因为我喜欢生成尽可能干净的代码。

问候

凯文

正如您在问题中所说,并非所有用户都会拥有机器人,因此 预计 会遇到一些空值。

我认为在这种情况下,您可以 return null,因为找不到机器人似乎不是 例外 的情况。

重要的是您要说明您return的原因,以避免空指针异常。

一般来说,引发异常需要额外的努力(在 JVM 部分)所以我会说 return 一个值来指示丢失的记录 - 即当 ID 不存在时,如果你的数据库连接中断则引发异常当时

我会说,如果在调用 getPvpBotId(int userId) 的地方,组件严重依赖于 BotId,例如它是一个用于处理 PvpBot 相关内容的模块 and/or BotId 是预期的,你会抛出异常。

如果在检索到 BotId 时,PvpBot 相关数据只是组件的一部分(例如,如果用户有 PvpBot,则显示额外的 information/functionality =] 附件。)那么函数应该 return null 而不是异常。

考虑使用 Optional type of the guava library。 它专为您的场景而设计。您可以 return Optional.absent() 而不是 returning null,从而以良好类型化的方式向您的方法的用户发出您的 Bot 不存在的信号,并避免可能的空指针。

您的代码如下所示:

public Optional<Integer> getPvpBotId(int userId) {
  if (userHasBot()) { // insert your routine here
    return Optional.of(botid);
  }
  else {
    return Optional.absent();
  }
 }

来电者能够区分:

 if (getPvpBotId(12).isPresent()) {
   Integer botId = getPvpBotId(12).get();
 }
 else {
   // Not Bot is present...
 }