草庐IT

Java 和 SQL : return null or throw exception?

coder 2023-10-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() 将为 null ResultSet 返回 false,或者将生成异常,如下所示:

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

3。如果在从 ResultSet 的当前行初始化一个 dog 对象时,发生了一些不好的事情,比如:连接失败,不兼容的值已传递给 dog 属性 setter ,等等?到目前为止,哈希表中可能有 10 个元素,或者没有(第一行)。下一步将是什么:a) 返回 null 哈希表; b) 返回结果哈希表,就是这个阶段的样子; c) 抛出异常:这里的异常类型是什么?

4.我想你们都会同意这一点:没有什么不好的事情发生,审讯没有行,将返回一个空值。然而,@Thorbjørn Ravn Andersen 说 here我应该返回 NullObject 而不是空值。我想知道那是什么。

5.我注意到人们和一群人说应该将应用程序拆分为多个层或某种级别。考虑到上面的例子,这里有哪些层,除了这些我能想到的:

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

第 2 层::??? : 构造新 Dog 对象的某个层:我的 Dog 对象。

第 3 层::? : 我打算对狗的集合做某事的某个层:主要是 GUI 层,或用户界面的子层。

按照应用程序流程,如果在第一层发生异常,最好的想法是如何处理?我的想法:捕获异常,记录异常,返回一些值。这是最佳做法吗?

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

最佳答案

我会避免以下情况

   sql.append("SELECT * FROM ").append("dogs_table");
   sql.append(" WHERE ").append(colName).append("='");
                        sql.append(colValue).append("'");

而是使用 PreparedStatement及其关联的参数设置方法(setString())等。这将防止 colValue 的值有引号和 SQL 注入(inject)攻击(或更一般地, colValue 形成一些 SQL 语法)。

如果集合只是空的,我永远不会返回 null。这似乎非常违反直觉,从客户的角度来看完全出乎意料。

我不建议在错误情况下返回 null,因为您的客户必须明确检查这一点(并且可能会忘记)。如果需要,我会返回一个空集合(这可能类似于您对空对象的评论),或者更有可能抛出异常(取决于情况和严重程度)。异常很有用,因为它会携带一些与遇到的错误相关的信息。 Null 什么也没告诉你。

如果在构建Dog 对象时遇到问题怎么办?我认为这取决于您希望您的应用程序有多健壮和有弹性。返回 Dog 的子集是否有问题,或者它会完全是灾难性的并且您需要报告这个吗?这是一个应用程序要求(过去我必须满足这两种情况 - 尽力而为全有或全无)。

一些观察。我会用HashMap而不是旧的 Hashtable(同步所有访问,更重要的是,不是一个合适的 Collection - 如果你有一个 Collection 你可以传递它任何其他方法期望 any Collection) 和 StringBuilder出于类似的原因,在 StringBuffer 之上。不是主要问题,但值得了解。

关于Java 和 SQL : return null or throw exception?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1544952/

有关Java 和 SQL : return null or throw exception?的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  9. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  10. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

随机推荐