澄清如何在Java中抛出和捕获自定义异常

时间:2013-06-27 13:52:19

标签: java exception-handling error-handling

所以我有这个程序基本上是在java中重新创建SQL。我有这个“驱动程序”类,可以控制整个事情。它调用并实例化各种类和方法,使其全部工作。在这里,我有这个方法

public void checkCommand(String input) {

for (Command c : commands) {
    if (c.matches(input)) {
        try {
            c.execute();
        } catch (MyException e) {
            System.out.println(e.getMessage());
        }
        return;
    }
}
System.out.println("That was not a valid command.");

Execute是一个将在输入的每个命令上调用的方法。因此,在某些方面,每件事都会经历这一点。在DefineTableCommand类中,执行contains

database.addTable(tableName, fieldList);

database是我用来存储所有表的Object的单例实例。 addTable命令调用其他一些东西,依此类推。在这些中,我有一些可能出错的方法,比如表名已经存在或者沿着这些行。

public void addTable(String tableName, String fieldList) throws MyException {
    Table table;
    table = new Table(tableName, fieldList);
    if (instance.checkForDuplicates(tableName)) {
       throw new MyException(
            "There was a table with that name already present.");
    } else {
         instance.tableCollection.put(tableName, table);
    }
}

现在,我想要发生的事情以及我认为会发生的事情是,异常将从addTable抛出,异常将在堆栈中传递给checkCommand中的catch。这似乎并非如此,我不确定我理解为什么。

进一步解释。向用户提供一个提示,在该提示中他们输入各种命令(例如,定义表emp具有字段(名称varchar))如果他们的命令有问题,他们应该看到错误消息,但程序应该继续运行。所以我们说他们输入一个与已经存在的表同名的表,应该给出一个错误消息,程序继续没有新表。而不是打印错误消息,但仍未添加表。

2 个答案:

答案 0 :(得分:1)

确保execute()的部分签名是:

    execute() throws MyException

并且在其实现中不会捕获MyException,如:

    //eg
    void execute() throws MyException
    {
      database.addTable(tableName, fieldList);
     //any code
    }

如果是这种情况。

答案 1 :(得分:0)

确保在命令类execute()方法

之前没有捕获 MyException