IndexOutOfBoundsException: charAt: 0 >= length 0 在某些版本的 Android 上

Posted

技术标签:

【中文标题】IndexOutOfBoundsException: charAt: 0 >= length 0 在某些版本的 Android 上【英文标题】:IndexOutOfBoundsException: charAt: 0 >= length 0 on some versions of Android 【发布时间】:2013-04-29 21:59:02 【问题描述】:

我正在尝试使用 Java 和 Eclipse 制作应用程序(目前使用 B4A,但想扩展我的可用资源和制作库的能力)

在尝试使用片段实现对话框时,我遵循了示例here。

我不断得到

05-06 13:40:21.060: E/SensorManager(18538): thread start
05-06 13:40:21.105: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0

我尝试过调试,但调试器永远不会因任何错误而停止(而且我是这个调试器的新手,所以不知道如何解决这个问题)。

有人知道异常是在哪里引起的吗? (为了确保它在任何地方都不是胖手指,我通过 git 下载并尝试了它,并在 logcat 中收到完全相同的错误)

这是我的 mainActivity.java:

package com.example.fragmenttest;
import com.example.fragmenttest.EditNameDialog.EditNameDialogListener;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends FragmentActivity  implements EditNameDialogListener 

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_edit_name);
    showEditDialog();


private void showEditDialog() 
    FragmentManager fm = getSupportFragmentManager();
    EditNameDialog editNameDialog = new EditNameDialog();
    editNameDialog.show(fm, "fragment_edit_name");


@Override
public void onFinishEditDialog(String inputText) 
    Toast.makeText(this, "Hi, " + inputText, Toast.LENGTH_SHORT).show();


这里是 EditNameDialog.java:

package com.example.fragmenttest;

import android.support.v4.app.DialogFragment;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager.LayoutParams;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;


public class EditNameDialog extends DialogFragment implements OnEditorActionListener 

public interface EditNameDialogListener 
    void onFinishEditDialog(String inputText);


private EditText mEditText;

public EditNameDialog() 
    // Empty constructor required for DialogFragment


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
    View view = inflater.inflate(R.layout.fragment_edit_name, container);
    mEditText = (EditText) view.findViewById(R.id.txt_your_name);
    getDialog().setTitle("Hello");

    // Show soft keyboard automatically
    mEditText.requestFocus();
    getDialog().getWindow().setSoftInputMode(
            LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    mEditText.setOnEditorActionListener(this);

    return view;


@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
    if (EditorInfo.IME_ACTION_DONE == actionId) 
        // Return input text to activity
        EditNameDialogListener activity = (EditNameDialogListener) getActivity();
        activity.onFinishEditDialog(mEditText.getText().toString());
        this.dismiss();
        return true;
    
    return false;


还有我的字符串资源文件:

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="app_name">fragmentTest</string>
    <string name="hint_value">hint</string>
    <string name="your_name">Your name</string>

</resources>

从 logcat 完成 StackTrace:(与顶部没有区别)

05-06 13:40:21.060: E/SensorManager(18538): thread start
05-06 13:40:21.105: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.105: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.110: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.200: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.205: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.205: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.210: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.215: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.275: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.275: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.300: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.300: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.300: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.470: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.470: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.725: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0
05-06 13:40:21.725: E/Dynamiclayout(18538): java.lang.IndexOutOfBoundsException: charAt: 0 >= length 0

编辑: 在运行 4.1.2 的 Galaxy S3 上运行。在运行 2.3.4 的 Galaxy SL 上试用时,绝对没有 logcat 问题。这告诉我它与平台相关,但在我的搜索中,我没有看到任何与 Android 版本相关的内容。跟进问题,是否有人知道可能导致此错误的 JB 问题(或我提到的其他任何内容)?

【问题讨论】:

发布完整的堆栈跟踪 发布 logcat 输出。 你有办法解决这个问题吗? 我在使用三星 Galaxy S III 和 android 4.1.2 时也遇到了错误,但我朋友的 Galaxy S III 使用 Cyanogen Mod 4.3 时没有出现这样的错误。肯定是关于平台的。 这个错误几乎出现在我的三星 note 2 上的所有市场应用程序上,包括 gmail。应该是平台问题。我注意到每当与 SearchView 交互时都会抛出它。 【参考方案1】:

异常可能是android.text.SpannableStringBuilder#charAt(int)抛出的。

/**
 * Return the char at the specified offset within the buffer.
 */
public char charAt(int where) 
    int len = length();
    if (where < 0) 
        throw new IndexOutOfBoundsException("charAt: " + where + " < 0");
     else if (where >= len) 
        throw new IndexOutOfBoundsException("charAt: " + where + " >= length " + len);
    

    if (where >= mGapStart)
        return mText[where + mGapLength];
    else
        return mText[where];

我猜你的代码中执行了某种线程不安全的操作。

例如,可能值得尝试将 showEditDialog() 从 onCreate(Bundle) 移至 onResume()。如果它不能解决问题,接下来要检查 EditNameDialog#onCreateView。

Android API 有许多 onCreateXxx 方法,我们应该避免在这些方法中做一些记录和未记录的事情。

【讨论】:

以上是关于IndexOutOfBoundsException: charAt: 0 >= length 0 在某些版本的 Android 上的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IndexOutOfBoundsException:源不适合目标

ListView IndexOutOfBoundsException

IndexOutOfBoundsException 没有被抛出 JFrame

在索引处添加到 ArrayList 时出现 IndexOutOfBoundsException

RecyclerView:检测到 IndexOutOfBoundsException 不一致。无效的项目位置

ArrayIndexOutOfBoundsException 和 IndexOutOfBoundsException 之间的区别?