调用Dialog.show()时出现ArrayIndexOutOfBoundsException

时间:2012-03-18 01:38:02

标签: android android-theme

我在三星Galaxy S II(GT-I9100G)上看到了这一点。三星NTT DOCOMO Galaxy S II LTE(SC-03D)。

我正在建立第14级,目标是10级(最低3级)。

我认为它与主题有关,但不知道从哪里开始。我很确定所有Galaxy SII都没有发生,否则我会得到更多的报道。

或者,在调用此代码时,活动可能已被破坏 - 这会导致它吗?

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.app_icon);
builder.setTitle("my title");
builder.setMessage("my message which has about 7 lines and each line is short");
builder.setPositiveButton(R.string.ok, null);
builder.show();

log cat:

java.lang.ArrayIndexOutOfBoundsException: null
 at android.content.res.TypedArray.getInt(TypedArray.java:248)
 at android.widget.ScrollView.<init>(ScrollView.java:173)
 at android.widget.ScrollView.<init>(ScrollView.java:161)
 at java.lang.reflect.Constructor.constructNative(Constructor.java:-2)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:415)
 at android.view.LayoutInflater.createView(LayoutInflater.java:505)
 at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
 at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
 at android.view.LayoutInflater.rInflate(LayoutInflater.java:626)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
 at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:215)
 at com.android.internal.app.AlertController.installContent(AlertController.java:215)
 at android.app.AlertDialog.onCreate(AlertDialog.java:251)
 at android.app.Dialog.dispatchOnCreate(Dialog.java:307)
 at android.app.Dialog.show(Dialog.java:225)
 at android.app.AlertDialog$Builder.show(AlertDialog.java:823)

3 个答案:

答案 0 :(得分:1)

导致异常的代码应该是:

TypedArray.getInt(TypedArray.java:248)

/**
 * Retrieve the integer value for the attribute at <var>index</var>.
 * 
 * @param index Index of attribute to retrieve.
 * @param defValue Value to return if the attribute is not defined.
 * 
 * @return Attribute int value, or defValue if not defined.
 */
public int getInt(int index, int defValue) {
    index *= AssetManager.STYLE_NUM_ENTRIES;
    final int[] data = mData;
    final int type = data[index+AssetManager.STYLE_TYPE];
    if (type == TypedValue.TYPE_NULL) {
        return defValue;
    } else if (type >= TypedValue.TYPE_FIRST_INT
        && type <= TypedValue.TYPE_LAST_INT) {
        // vvvvvvvvvvvvvvvvvvvvvv 248
        return data[index+AssetManager.STYLE_DATA];
        // ^^^^^^^^^^^^^^^^^^^^^^ 248
    }

    TypedValue v = mValue;
    if (getValueAt(index, v)) {
        Log.w(Resources.TAG, "Converting to int: " + v);
        return XmlUtils.convertValueToInt(
            v.coerceToString(), defValue);
    }
    Log.w(Resources.TAG, "getInt of bad type: 0x"
          + Integer.toHexString(type));
    return defValue;
}

奇怪的是getInt()中没有ScrollView.java(为什么该对话框中甚至还有ScrollView?)。此例外也不寻常。您通常会获得Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=12345而不是null

没有真正的线索是什么问题。但它实际上可能是由一些自定义布局的东西引起的,因为getInt通常会被用来查询View属性

case R.styleable.View_scrollbars:
    final int scrollbars = a.getInt(attr, SCROLLBARS_NONE);
    if (scrollbars != SCROLLBARS_NONE) {
        viewFlagValues |= scrollbars;

我会说这是一个自定义固件或由三星完成的一些软件修改导致这种情况。

答案 1 :(得分:1)

在构造函数时,框架使用TypedArray从用于膨胀视图的xml布局中检索xml数据。标准的android在ScrollView的构造函数时间内没有检索到int,因此它看起来像是三星修改了框架的那部分。 (无论如何,它应该在try / cacth / finally块中,因此它们在那里做得不好)。您看到的ScrollView是那些设备中默认对话框实现中的ScrollView(通常,对话框的所有内容都应该在滚动视图内部,以防它不适合屏幕,特别是在横向模式下)。 您可以尝试为自己的视图充气并使用对话框构建器的setView进行设置。

View content = View.inflate(context, R.layout.my_view_content,null);
            TextView message = (TextView)content.findViewById(R.id.my_message);
            message.setText("my message which has about 7 lines and each line is short");
            new AlertDialog.Builder(context)
            .setTitle("my title")
            .setView(content)
            .show();

答案 2 :(得分:0)

当您迭代或尝试访问数组/列表中不在数组/列表大小/长度内的某个索引时,抛出

ArrayIndexOutOfBoundsException

在您的情况下,可能是任何其他处理数组的代码。如果存在任何处理数组的代码(检查抛出异常的行),请发布它。

另一件事,将setPositiveButton()第二个参数更改为new DialogInterface.onClickListener(){},否则它将无法使用:)