当前位置: 首页 > 面试题库 >

Java和SQL:返回null还是抛出异常?

郎思远
2023-03-14
问题内容

这是另一个有争议的主题,但是这次我只在寻找简单且记录在案的答案。场景:

让我们假设以下方法:

 public static Hashtable<Long, Dog> getSomeDogs(String colName, String colValue) {
  Hashtable<Long, Dog> result = new Hashtable<Long, Dog>();
  StringBuffer sql = null;
  Dog dog = null;
  ResultSet rs = null;
      try {
          sql = new StringBuffer();
          sql.append("SELECT * FROM ").append("dogs_table");
          sql.append(" WHERE ").append(colName).append("='");
          sql.append(colValue).append("'");
          rs = executeQuery(sql.toString());
              while (rs.next()) {
                  dog= new Dog();
                  //...initialize the dog from the current resultSet row
              result.put(new Long(dog.getId()), dog);
              }
          }
     catch (Exception e) {
         createErrorMsg(e);
         result = null; //i wonder....
         }
     finally {
         closeResultSet(rs); //this method tests for null rs and other stuff when closing the rs.
     }
   return result;
 }

问题:

1.您如何建议改进这种归还某些属性的狗的技术?

2. rs.next()对于空的ResultSet将返回false,或者将生成异常,例如:

字符串str = null; System.out.println(str.toString());

3.如果在从ResultSet的当前行初始化一个dog对象时,发生了什么不好的事情,例如:连接失败,不兼容的值已传递给dog属性设置器等怎么办?到现在,哈希表中可能有10个元素,或者没有(第一行)。接下来的动作是什么:a)返回空哈希表;b)返回结果哈希表,此阶段的方式;c)抛出异常:这里的异常类型是什么?

4.我想你们都会同意这一点:没有什么不好的事情发生,在查询中没有行,将返回空值。但是,@ThorbjørnRavn Andersen
在这里说,我应该返回NullObject而不是null值。我不知道那是什么。

5.我注意到有人和一群人在说,应该将应用程序分成若干层或某种级别。考虑上面的示例,除了我可以想到的那些层之外,这里还有什么层:

Layer1 ::执行操作的数据库层:此方法。

Layer2 :: ??? :构造新Dog对象的某些层:my Dog对象。

Layer3 ::吗?:某些层,我打算对狗进行处理:GUI层,主要是用户界面的子层。

遵循应用程序流程,如果在第一层发生异常,最好的处理方法是什么?我的想法:捕获异常,记录异常,返回一些值。那是最佳实践吗?

曼尼(Manny)感谢您的回答,我期待看到其他人对这些问题的看法。


问题答案:

你问五个问题

1.您如何建议改进这种归还某些属性的狗的技术?

实际上有几个。

  • 您的方法是静态的-这并不可怕,但是会导致您使用另一个静态的“ executeQuery”,对我来说,它具有Singleton的味道。
  • “ Dogs”类违反了OO命名惯例-除非名词的一个实例包含一组东西,否则复数名词不具有良好的类名-并且看来Dogs实际上是“ Dog”。
  • HashTable 已被弃用。HashMap或ConcurrentHashMap可以提供更好的性能。
  • 我看不出有创建带有多个追加的查询的第一部分的原因-不错,但可读性比可能差,因此sql.append(“ SELECT * FROM dogs_table WHERE”); 如果您只是硬编码所选的列(*)和表名(dogs_table),那么这将是一个更明智的开始。

2. rs.next()对于空的ResultSet将返回false,否则将生成异常

这似乎不是问题,但是是的,一旦不再需要处理任何行,rs.next()就会返回false。

3.如果在从ResultSet的当前行初始化狗对象时发生了什么不好的情况怎么办?

如果发生“不好的事情”,下一步要做的就是您和您的设计。有一种宽容的方法(返回所有可以的行),而有一种宽容的方法(引发异常)。我倾向于倾向于“不宽容”的方法,因为使用“宽容”的方法,用户将不知道您还没有返回所有存在的行-
只是返回了错误之前得到的所有行。但是可能会有一些宽容的方法

4.我想你们都会同意这一点:没有什么不好的事情发生,在查询中没有行,将返回空值。

这显然不是 正确的
答案。首先,它不是所写方法中发生的事情。它将返回一个空的HashTable(这就是“空对象”的含义)。其次,在“未找到结果”的情况下,null并不总是答案。

我已经看到过null,但是我也看到了一个空的结果变量。我声称它们都是正确的方法,但我更喜欢空结果变量。但是,始终最好保持一致,因此选择一种返回“无结果”的方法并坚持下去。

5.我注意到有人和一群人在说,应该将应用程序分成若干层或某种级别。

在不查看应用程序其余部分的情况下,这比其他方法更难回答。



 类似资料:
  • 我正在尝试使用HttpWebRequest验证Url的存在。我发现了一些基本上这样做的示例: 但是,如果url确实损坏了,它不会返回响应,而是抛出异常。 我将代码修改为: 这似乎终于做到了我想要的。 但是我想知道,为什么请求会抛出异常,而不是返回带有NotFindstatus代码的响应?

  • 我见过这样的例子 但我也认为这是一种选择 抛出异常或简单返回NotFound (IHttpActionResult实例)有什么好处吗? 我知道响应/请求管道中的某些阶段可以处理这些结果中的任何一个,就像第一个示例一样

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 主要内容:throws 声明异常,throw 拋出异常Java 中的异常处理除了捕获异常和处理异常之外,还包括声明异常和拋出异常。实现声明和抛出异常的关键字非常相似,它们是 throws 和 throw。 可以通过 throws 关键字在方法上声明该方法要拋出的异常,然后 在方法内部通过 throw 拋出异常对象。本节详细介绍在 Java 中如何声明异常和拋出异常。 throws 声明异常 当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部

  • 问题内容: 我目前正在使用play2框架。 我有几个正在抛出的类,但是play2s全局处理程序使用throwable而不是异常。 例如我的一门课是抛出一个。我是否可以检查可抛物体(如果是)? 问题答案: 您可以使用它来检查它是否存在。 例: 假设是参考。