从未初始化的对象

时间:2016-06-14 18:07:05

标签: java android object null android-view

我希望我的代码能够帮助确定自动需要哪种对象类型。

背景

附加小部件的代码通常如下:

TextView textView = (TextView) findViewById(R.id.textView);

我想检查是否已正确找到textView以避免错误。为此,我使用了自定义(AttachWidgetException)异常:

if(textView == null) throw new AttachWidgetException(name);

我决定创建一个简化它的函数,而不是为我的代码(DRY)中的每个小部件重复这两行。我错误地认为我可以这样做:

public View attachWidget(View view, int resID, String name) throws AttachWidgetException {
    view = (view.getClass) findViewById(resID);

    if(view == null) throw new AttachWidgetException(name);
    return view;
}

通过以下方式从尝试块中调用:

 TextView textView = attachWidget(textView, R.id.textView, "textView");

问题:

但是,由于两个原因,这并不起作用。调用者的对象期望TextView不是View。我认为另一个原因是 view 尚未实例化,因此报告为:

java.lang.Class <capture<? extends android.view.View>

...这不是View的扩展。要解决这个问题,我需要将attachWidget中的行更改为:

view = findViewById(resID);

...以及致电:

TextView textView = (TextView) attachWidget(textView, R.id.textView, "textView");

...这使得View输入参数无用。我们现在可以删除它。

问题:

这真的不是太糟糕,但有没有办法做到这一点,所以我不需要手动添加演员?可以 attachWidget 自动确定它需要返回TextView吗?我非常确定我会朝着任何可能解决方案的错误方向前进。仿制药会不会以任何方式帮助我?

如果我在说明中使用了错误的术语,请原谅我。我将不胜感激任何代码/术语/方法更正。

1 个答案:

答案 0 :(得分:1)

当视图为view.getClass时,您无法致电null。试着这样做:

public <T extends View> T attachWidget(Class<T> type, int resID, String name) throws AttachWidgetException {
        View view = findViewById(resID);
        if (view == null) throw new AttachWidgetException(name);
    try {
        return type.cast(view);  
    } catch (ClassCastException) {
        e.printStackTrace();
        throw new AttachWidgetException(name);
    } 
}

在这种情况下,您可以调用:

TextView textView = attachWidget(TextView.class, R.id.textView, "textView");