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