有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对返回数据的正确处理

我有一个关于正确处理为一个项目编写的DAO库返回的问题。这个库可能会被其他人使用,我想正确地使用它。我应该如何处理DAO函数的返回语句

示例1 我有函数getCustomer,它应该返回字符串。如果查询没有返回任何结果,我应该返回null、空字符串还是引发某种异常

示例2 我有一个函数getCutomerList,它返回ArrayList类型的值<;字符串>;。如果查询没有返回任何结果,我应该返回null、空ArrayList还是引发一些异常

示例3 检测到一些SQL异常,我应该怎么做,抛出异常还是执行trycatch它可能发生在哪个块上

在我的案例中,“良好”实践或“最佳”实践是什么


共 (4) 个答案

  1. # 1 楼答案

    因为它是您的API,所以只要您保持一致并确保正确记录,任何方法都是好的

    为1&;2: 不过请注意,返回null将强制客户端代码继续执行如下检查:

    result = yourAPICall();
    if(result != null){
       // do something
    }
    

    这就是为什么我更喜欢返回空对象或集合

    对于3: 这将取决于您的API设计。但首先,不要在调用堆栈中抛出低级异常。您应该将它们包装在为您的API设计的自定义异常类中,这样您的客户机代码只需要捕获API异常,而不需要捕获各种较低级别的异常(SQLException、IOException等)

    其次,您必须首先确定抛出异常是否有任何好处。抛出异常使客户端代码能够自定义如何处理其API依赖项遇到的问题。但是抛出它也会禁止作为API设计者的您设计内部意外事件,这将允许您的代码可能从问题中恢复(使您的API不那么健壮)

  2. # 2 楼答案

    示例1:由于未检索到任何内容,因此应返回null。或者,可以选择空对象模式

    示例2:宁愿空ArrayList也不要null。请参阅“有效Java”第43项:返回空数组或集合,而不是null

    示例3:将SQLException转换为更高的异常并抛出它。请参阅“有效Java”第61项:抛出适合于摘要的异常

  3. # 3 楼答案

    您的库似乎正在进行类似数据库的调用。如果是这样的话,那么我将完全按照JPA 2 specification实现的方式来做

    我的意思是,查看JPAAPI中的find()方法,并准确返回它们在那里做的事情

        /**
         * Find by primary key.
         * @param entityClass
         * @param primaryKey
         * @return the found entity instance or null
         *    if the entity does not exist
         * @throws IllegalStateException if this EntityManager has been closed.
         * @throws IllegalArgumentException if the first argument does
         *    not denote an entity type or the second
         *    argument is not a valid type for that
         *    entity's primary key
         */
        public <T> T find(Class<T> entityClass, Object primaryKey);
    

    您可以在find中看到,我认为它类似于您的getCustomer()方法,如果没有找到,它将返回null,如果参数无效,则只抛出IllegalArgumentException

    如果find()方法与getCustomer()不接近,则应实现与getSingleResult()相同的行为:

        /**
         * Execute a SELECT query that returns a single result.
         * @return the result
         * @throws EntityNotFoundException if there is no result
         * @throws NonUniqueResultException if more than one result
         * @throws IllegalStateException if called for a Java 
         *    Persistence query language UPDATE or DELETE statement
         */
        public Object getSingleResult();
    

    如果没有找到结果,它将抛出EntityNotFoundException;如果找到多个实例,它将抛出NonUniqueResultException;如果SQL错误,它将抛出IllegalStateException

    你必须决定哪种行为最适合你

    这同样适用于getResultList()

    /**
     * Execute a SELECT query and return the query results
     * as a List.
     * @return a list of the results
     * @throws IllegalStateException if called for a Java 
     *    Persistence query language UPDATE or DELETE statement
     */   
    public List getResultList();
    

    getResultList()如果找不到,则返回null;如果SQL非法,则仅引发异常

    通过遵循这一行为,您保持了一致性,您的用户将有一种了解库的感觉


    另一种行为是返回空集合,而不是null。这就是Google Guava如何实现他们的API的,这也是为什么人们更喜欢这样做的原因。但是,我喜欢一致性,并且仍然认为应该实现尽可能接近standard的库


    资源

    Joshua Bloch made a video explaining how to design a good API and why it matters

  4. # 4 楼答案

    1. 空。但是方法getCustomer()应该返回Customer。如果它返回字符串,则可能应称为getCustomerName()getCustomerId()
    2. 空列表
    3. 抛出异常。可能会用应用层异常来包装它