操作成功/失败的返回布尔值是Java的一个好习惯吗?

时间:2015-02-25 14:19:30

标签: java

我有一些功能与数据库一起使用。 我在这里设置了一个try / catch用于错误处理,并显示一条消息,它工作正常。

现在调用此删除函数的类需要知道是否存在错误。在我的情况下:如果成功则刷新GUI,如果失败则无需执行任务(因为已经显示消息消息对话框)。

我想出了一个在这个函数中返回布尔值的想法。

public static Boolean delete(int id){

    String id2 = Integer.toString(id);
    try {
        String sql = 
                "DELETE FROM toDoItem " +
                "WHERE id = ?;";
        String[] values = {id2};
        SQLiteConnection.start();
        SQLiteConnection.updateWithPara(sql, values);
    } catch (SQLException e) {
        Main.getGui().alert("Fail when doing delete in DataBase.");
        System.out.println("Exception : "+ e.getMessage());
        return false;
    }
    return true;
}

不知道这是好还是坏,请告诉你。


编辑:

以下是有关如何使用的详细信息:

让我们说上面的代码在A类中, 在B班:

public boolean deleteItem(int id){
    int i = index.get(id);
    if(theList[i].delete()){  //<---- here is the function from Class A
        theList[i] = null;
        index.remove(id);
        retutn true;
    }
    retutn false; 
}

我需要在多个课程中传递布尔值,我不知道这是否可以更好地通过......

C类中的

public void toDoList_deleteItem(){
    MyButton btn = (MyButton)source;
    int id = btn.getRefId();
    List toDoList = Main.getToDoList();
    if(toDoList.deleteItem(id)){  //<-------function in Class B
        Main.getGui().refresh();
    }
}

编辑2:

我注意到这个问题在某种程度上更有可能要求&#34;我应该在数据库层处理哪一个影响GUI层的异常?&#34; ......就是这样。如果问题标题应该编辑,请纠正我。

5 个答案:

答案 0 :(得分:9)

看起来您正在返回boolean状态,表示发生了异常情况。一般来说,这不是一个好习惯,原因有两个:

  • 它鼓励一种容易出错的处理异常的方式 - 很容易错过状态检查,导致忽略错误
  • 它限制了您的API报告错误的能力 - 单个通过/失败位并不总是足够,可能需要传递有关错误的更多信息。

更好的方法是定义特定于应用程序的异常,并在API中使用它。这会强制API的用户注意可能发生的异常情况,同时允许您根据需要传递尽可能多的(或尽可能少的)其他信息。同时,您的代码不会因每个API调用上的if (!delete(id)) { /* handle error */ }代码而受到污染,缩小代码库并提高其可读性。

  

您能告诉我更多关于“定义特定于应用程序的异常”的信息,或者显示一些代码示例吗?

我将如何做到这一点:

public class DataAccessException extends Exception {
    ... // Define getters/setters for passing more info about the problem
}
...
public static void delete(int id) throws DataAccessException {
    try {
        ... // Do something that may lead to SQLException
    } catch (SQLException se) {
        // Do additional logging etc., then
        throw new DataAccessException("Error deleting "+id, se);
    }
}

注意:通常会给自定义异常提供四个构造函数,这些构造函数镜像Exception类的构造函数以允许异常链接。构造函数描述为here

答案 1 :(得分:4)

请勿返回Boolean,并返回boolean。由于这不是异常/错误条件,因此没问题。

答案 2 :(得分:3)

只要您不希望调用者知道发生了什么,只是它失败了(并且失败是其预期行为的一部分),您应该没问题。

话虽如此,我注意到这一点:Main.getGui().alert("Fail when doing delete in DataBase.");

您似乎正在从其他地方访问GUI层。如果您决定多线程化应用程序,这可能会导致问题。此外,通常认为使图层不相交是一种好习惯。

答案 3 :(得分:1)

如果您不期望失败,则应使用例外。

在你的情况下,如果抛出SQLException并且不影响你的程序对你来说没问题,那么可以返回一个布尔值。

如果导致删除失败的SQLExcetion会导致应用程序的另一部分出现问题,最好抛出异常。

编辑:

根据您的编辑,似乎您在发生错误时正在进行一些维护和清理。在这种情况下,我建议使用Exceptions比使用布尔值来控制执行更好。

答案 4 :(得分:1)

这个问题主要基于意见。就个人而言,我不希望在那时抓住异常。

根据caller的{​​{1}}应该做什么,您可能需要其他结果。因此,您最好添加一个throw语句,让调用方法决定错误是否至关重要 - 或者是否可以继续。

delete()true没有必要让调用者正确决定。他不知道由于数据库错误,由于外键限制或其他原因导致删除失败。

让异常冒泡调用堆栈将为调用者提供正确的错误,增加以正确方式处理错误的机会,或者只显示自定义错误消息,帮助用户采取适当的操作。< / p>