我是Android环境中的新手,我已经开始编写一些代码来在数据库上执行一些查询。当我不得不处理异常时,我不知道合适的方法是什么-在安卓之外,我曾经在方法上使用throws
声明,但似乎throws
在安卓中是不允许的?只有try-catch
?我之所以这么说,是因为eclipse并没有建议我像离开安卓环境时那样添加throws
声明,我猜它与extends Activity
有关。那么,在android中处理异常的合适方法是什么呢?用try-catch
包围每句话会让我的代码看起来很糟糕,而这并不是我真正想要做的。
发布于 2011-01-02 00:37:14
如果您正在使用的方法已经抛出了异常,那么您可能只需要将该异常重新抛出为新类型:
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
就是这样的例子。
发布于 2012-01-23 22:54:55
我只是想知道在Android环境中对“抛出”的一些奇怪的处理方式,并在这里发现了这个老问题。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
方法的签名不能通过继承实现来更改时,他是对的。其次,Zeki正确地指出了已检查异常和未检查异常之间的区别。
现在第三,我想补充的是,最大的混乱是由SQLException
. 引起的
上面例子中使用的SQLException
是Android类型的android.database.SQLException
,并且继承了java.lang.RuntimeException
--它是一个未经检查的异常!不需要抛出声明!
这不是经典的java.sql.SQLException
--它是一个java.lang.Exception
,需要try/catch/throws。
发布于 2011-01-02 00:25:11
你不能“通过eclipse在android中添加抛出”的原因是因为你不是定义接口或超类的人。如果你想给方法签名添加一个异常(就像你说的那样),它也需要被添加到接口中,并且你不能控制它们,所以你不能改变它。
例如方法
protected void onCreate(捆绑包);
如果您想抛出一个异常,则需要将方法签名更改为(例如)
protected void onCreate(捆绑包savedInstanceState)抛出MyException;
但是,它还需要更改onCreate的定义位置,它在Activity类中--这是一个您不能更改的类(因为它是由安卓库提供的)。
因此,您唯一的选择是捕获异常并对其执行某些操作(或者干脆忽略它)。你可以敬酒来展示错误
catch (Exception e) {
Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT);
toast.show();
}
https://stackoverflow.com/questions/4575736
复制相似问题