首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免在Android上使用try/catch

避免在Android上使用try/catch
EN

Stack Overflow用户
提问于 2011-01-02 04:56:37
回答 3查看 97.7K关注 0票数 7

我是Android环境中的新手,我已经开始编写一些代码来在数据库上执行一些查询。当我不得不处理异常时,我不知道合适的方法是什么-在安卓之外,我曾经在方法上使用throws声明,但似乎throws在安卓中是不允许的?只有try-catch?我之所以这么说,是因为eclipse并没有建议我像离开安卓环境时那样添加throws声明,我猜它与extends Activity有关。那么,在android中处理异常的合适方法是什么呢?用try-catch包围每句话会让我的代码看起来很糟糕,而这并不是我真正想要做的。

EN

回答 3

Stack Overflow用户

发布于 2011-01-02 08:37:14

如果您正在使用的方法已经抛出了异常,那么您可能只需要将该异常重新抛出为新类型:

代码语言:javascript
运行
复制
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就是这样的例子。

票数 13
EN

Stack Overflow用户

发布于 2012-01-24 06:54:55

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

这段代码编译时没有错误:

代码语言:javascript
运行
复制
public void onCreate(SQLiteDatabase db)
{
    db.execSQL(DbMeta.T_DISGUISED.T_CREATE);
}

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

代码语言:javascript
运行
复制
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。

票数 4
EN

Stack Overflow用户

发布于 2011-01-02 08:25:11

你不能“通过eclipse在android中添加抛出”的原因是因为你不是定义接口或超类的人。如果你想给方法签名添加一个异常(就像你说的那样),它也需要被添加到接口中,并且你不能控制它们,所以你不能改变它。

例如方法

protected void onCreate(捆绑包);

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

protected void onCreate(捆绑包savedInstanceState)抛出MyException;

但是,它还需要更改onCreate的定义位置,它在Activity类中--这是一个您不能更改的类(因为它是由安卓库提供的)。

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

代码语言:javascript
运行
复制
catch (Exception e) {
  Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT);
  toast.show();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4575736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档