如果Activity或Fragment不包含所需的意图或参数,那么Android的最佳做法是什么?

时间:2017-08-07 03:14:21

标签: android android-fragments android-activity

如果我的Activity / Fragment要求编码器提供特定的意图或参数,我该如何处理编码器没有提供此意图或参数的情况?

说我有以下活动和片段:

public class MyActivity extends AppCompatActivity {

    public static final String KEY = "KEY";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (!getIntent().hasExtra(KEY)) {
            throw new RuntimeException("KEY is required");
        }
        super.onCreate(savedInstanceState);
    }
}

public class MyFragment extends Fragment {

    public static final String KEY = "KEY";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        if (!getArguments().containsKey(KEY)) {
            throw new RuntimeException("KEY is required");
        }

        //...
    }

}

我的直觉告诉我只是抛出异常并强制关闭应用程序,以便编码人员可以在他们的代码中纠正这个问题。如果是,那么哪个Exception最能描述这种情况呢?

此外,放置此类代码的最佳位置在哪里?例如,onCreat()for Activity?还是onAttach()或onCreateView()for Fragment?

3 个答案:

答案 0 :(得分:2)

你总是可以抛出异常,只要确保详细描述错误,以帮助其他开发者理解他们做错了什么。

另外,请记住,早期失败总是会更好。"而不是推迟例外 -

如果您需要关键数据,请尽快验证数据 并且不要隐藏"在特定用户流程的某个按钮点击下的例外情况 - 您希望一旦有人打开活动就明白它,以尽量减少开发人员不会注意到他/她的错误的风险。

<强> P.S

有一种很好的模式可以最大限度地减少这种编码错误。 您可以创建一个公共静态方法来实例化您的碎片和活动。

示例:

public static Intent newIntent(Context context, String requiredStr, int requiredInt) {
        Intent intent = new Intent(context, MyActivity.class);
        intent.putExtra("extra_str", requiredStr);
        intent.putExtra("extra_int", requiredInt);
        return intent;
    }

这样,开发者不必记住所有必需的数据。 然后你可以这样开始你的活动:

startActivity(MyActivity.newIntent(context, "string", 20));

答案 1 :(得分:1)

当应用程序因程序员错误而进入无效状态时崩溃是完全合理的。快速失败并提前失败。当然,您应该包含一条错误消息,说明程序员如何纠正错误。

如果IntentBundle中没有所需的值,我会说最常见的抛出异常是NullPointerException。你也可以抛出IllegalStateException

答案 2 :(得分:0)

仅在开发应用程序时才会发生此异常。如果用户得到这个例外,那么开发就没用了。

在开发过程中,以有组织的方式向开发人员展示一些错误只不过是为了让它变得有意义并且易于理解。

虽然这里有一个简单的toast或错误日志或alertdialog就足够了,因为最终级用户永远不会看到这种类型的数据传递异常!

要使应用程序崩溃,您可以使用UnsupportedOperationException,因为此处活动正在更改(操作)而没有数据(不受支持)。

此外,您可以使用NullPointerException,因为某些变量(将在下一步中使用)未获得值(null)。