避免Android上的try / catch

时间:2011-01-01 20:56:37

标签: java android exception-handling

我是Android环境中的新手,我已经开始编写一些代码来对数据库执行一些查询。当我必须处理异常时,我不知道采用什么方法 - 在Android中我曾经使用throws声明方法,但似乎throws在android中是不允许的?只是try-catch? 我这样说是因为eclipse不建议我添加throws声明,就像我不在Android环境中一样,我猜它与extends Activity有关。 那么在android中处理异常的适当方法是什么?使用try-catch围绕每个句子会使我的代码看起来很糟糕,这不是我想要做的。

3 个答案:

答案 0 :(得分:13)

如果您使用的方法已经抛出异常,您可能只想将异常重新抛出为新类型:

public void someMethod() throws IOException {
    try {
        //  Do database operation
    } catch (MyException e){
        throw new IOException(e.toString());
    }
}

//  Or, if there is no exception, use an unchecked exception:

public void otherMethod() {
    try {
        // DB operation
    } catch (MyException e){
        throw new RuntimeException(e);
    }
}

另一种选择是MyException延长RuntimeException。然后编译器不会强制您捕获它或将其添加到方法签名。 RuntimeExceptions称为未经检查的异常,这意味着您不必通过try / catch检查它们是否发生。这些示例包括NullPointerArrayOutOfBounds

答案 1 :(得分:4)

我只是想知道Android环境中对“throws”的一些奇怪处理,并在此发现了这个老问题。 Asker Jon “开始编写一些代码来执行数据库上的一些查询”,所以也许他注意到和我一样。

编译时没有错误:

public void onCreate(SQLiteDatabase db)
{
    db.execSQL(DbMeta.T_DISGUISED.T_CREATE);
}

尽管有这个声明(在javadoc弹出窗口中):

void android.database.sqlite.SQLiteDatabase.execSQL(String sql) throws SQLException

首先,当他指出onCreate方法的签名不能通过继承实现来改变时, monkjack 是正确的。 第二, Zeki 正确地指出了已检查和未检查的异常之间的区别。

现在第三,我想补充一点SQLException 造成的大混乱。

上面示例中使用的SQLException是Android类型android.database.SQLException并继承java.lang.RuntimeException - 这是一个未经检查的异常!不需要投掷声明!!!

这不是经典的java.sql.SQLException - 这是java.lang.Exception并需要尝试/捕获/抛出。

答案 2 :(得分:2)

你不能“通过eclipse在android中添加throws”的原因是因为你不是定义接口或超类的人。如果你想在方法签名中添加一个例外(就像你说你做的那样),它也需要添加到界面中,而你却无法控制它们,所以你无法改变它。

例如方法

protected void onCreate(Bundle savedInstanceState);

在活动中覆盖的

,如果要抛出异常,则需要将方法签名更改为(例如)

protected void onCreate(Bundle savedInstanceState)抛出MyException;

但是它还需要更改onCreate定义的位置,这是在Activity类中 - 这是一个你无法更改的类(因为它是由android库提供的)。

因此,您唯一的选择是捕获异常并对其执行某些操作(或者忽略它)。你可以做一个祝酒词来显示错误

catch (Exception e) {
  Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT);
  toast.show();
}