1

所以我有这个程序,它基本上是在 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 类中,执行包含

database.addTable(tableName, fieldList);

数据库是我用来存储所有表的对象的单例实例。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。情况似乎并非如此,我不确定我理解为什么。

进一步解释。如果他们的命令有问题,他们会看到一条错误消息,但程序应该继续运行。所以假设他们输入了一个与已经存在的表同名的表,应该给他们一个错误消息并且程序继续没有新表。相反,没有打印错误消息,但仍然没有添加表。

4

2 回答 2

1

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

    execute() throws MyException

并且在其实现中没有像 MyException 一样捕获:

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

如果是这种情况。

于 2013-06-27T15:48:38.143 回答
0

确保在命令类 execute() 方法抛出MyException之前没有捕获它

于 2013-06-27T14:23:34.793 回答