Java 捕获异常

Java 捕获异常,java,android,Java,Android,我得到了活动,在onCreate()中我尝试获取数据: protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); ............... fillUI(); } public void getDetailedItem(){ FeedParser parser=new FeedParser();

我得到了活动,在onCreate()中我尝试获取数据:

protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        ...............
        fillUI();
    }

 public void getDetailedItem(){
        FeedParser parser=new FeedParser();
        try{
           mItem=parser.parseDetailed();
        }catch(Exception e){
            closeAndShowError();
        }
    }

    public void fillUI(){
        getDetailedItem();
        if(mItem!=null){
        ...............
        }else{
          closeAndShowError();
        }
    }

private void closeAndShowError(){
        Context context = getApplicationContext();
        CharSequence text = getResources().getString(R.string.toast_error);
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, text, duration);
        toast.show();

        finish();
    }
问题是,当异常发生时,它会被捕获,我希望我的活动能够自行完成,但我仍然会执行fillUI()中的代码,所以我必须将if语句放在getDetailedItem()之后;
如何解决它?

语句不是立即返回,您的代码将继续运行,直到它确定它已完成。您需要为自己留下异常的指示器,并在异常发生时通过调用链返回,而不是继续运行。

因为您正在捕获异常;fillUI()函数从未收到任何错误通知

您的代码路径如下所示: fillUI->getDetailedItem->捕获异常->关闭和淋浴错误->完成()->返回关闭和淋浴错误->捕获块后返回getDetailedItem->返回fillUI

因此,基本上,在fillUI中调用getDetailedItem之后的代码是因为捕获了异常并且没有让其他函数知道。通过返回值,或者通过抛出(或者捕获)新异常。

finish()
会导致
活动停止,作为其生命周期的下一步。但在您调用它时,它仍处于另一个生命周期步骤的过程中:
onCreate()
。某种程度上,它不会立即退出,在方法的中间。


这就是答案,但是,最好重新设计一下代码。如果你在处理这样的问题,这可能不是最干净的处理方法。

你可以这样做:

public void getDetailedItem(){
        FeedParser parser=new FeedParser();
        try{
           mItem=parser.parseDetailed();
        }catch(Exception e){
           mItem = null;
        }
}

然后在
fillUI()
中,如果
mItem
null
则显示用户的错误

您可以将可能在
parseDetailed
中抛出的异常传递给
fillUI
方法:

public void getDetailedItem() throws Exception {
    FeedParser parser=new FeedParser();
    mItem=parser.parseDetailed();
}

public void fillUI(){
    try {
        getDetailedItem();
        // rest of your code..
    } catch(Exception e) {
        closeAndShowError();
    }
}

你能在
fillUI()
方法中捕获异常吗?