【问题标题】:Android Program is Crashing - Don't Know WhyAndroid 程序崩溃 - 不知道为什么
【发布时间】:2011-10-30 20:05:51
【问题描述】:

我有一个列表,它将过滤 EditText 字段中的输入,并根据他们键入的内容填充 ListView。

例如,如果用户键入“al”,它将填充名字或姓氏以“al”开头的名称。

我的问题是,当用户将 EditText 字段退格到没有输入字母的位置时,我的程序会崩溃。我不确定为什么我最初的 if 语句没有被使用。

这不是 ListView 为空导致崩溃的问题,因为如果我键入不在列表中的名称,ListView 将保持为空并且不会崩溃。

private void AlterAdapter() {
    partialNames.clear();

    if (searchName.getText().toString() == "")
        partialNames.add("There are no names that meet your criteria");
    else  {
            String seekString = searchName.getText().toString();
            String firstLetter = seekString.substring(0,1).toString().toUpperCase();
            Log.d("JAY", "The firstLetter is: " + firstLetter);

            if (!seekString.isEmpty() && seekString.length() == 1) {
                //firstLetter = seekString.toUpperCase();
                for (int i = 0; i < searchNames.size(); i++) {
                    if (searchNames.get(i).toString().contains(firstLetter)) {
                        partialNames.add(searchNames.get(i).toString());
                    }
                }
            }
            else if (!seekString.isEmpty() && seekString.length() > 1) {
                //searchCriteria = searchCriteria.concat(seekString);
                String searchWord = firstLetter.concat(seekString.substring(1,seekString.length()));
                Log.d("JAY", "The seekString is " + seekString);
                Log.d("JAY", "The searchWord is " + searchWord);
                for (int i = 0; i < searchNames.size(); i++) {
                    if (searchNames.get(i).toString().contains(searchWord)) {
                        partialNames.add(searchNames.get(i).toString());
                    }
                }
            }
    }
    adapter.notifyDataSetChanged();         
}

这里是日志:

D/AndroidRuntime(1518): 关闭虚拟机

W/dalvikvm(1518): threadid=1: 线程以未捕获的异常退出 (组=0x40015560)

E/AndroidRuntime(1518):致命异常:主要

E/AndroidRuntime(1518): java.lang.StringIndexOutOfBoundsException

E/AndroidRuntime(1518):在 java.lang.String.substring(String.java:1651)

E/AndroidRuntime(1518):在 com.jaylefler.contacts.SearchContacts.AlterAdapter(SearchContacts.java:92)

E/AndroidRuntime(1518):在 com.jaylefler.contacts.SearchContacts.access$0(SearchContacts.java:88)

E/AndroidRuntime(1518):在 com.jaylefler.contacts.SearchContacts$1.onTextChanged(SearchContacts.java:73)

E/AndroidRuntime(1518):在 android.widget.TextView.sendOnTextChanged(TextView.java:6295)

E/AndroidRuntime(1518):在 android.widget.TextView.handleTextChanged(TextView.java:6336)

E/AndroidRuntime(1518):在 android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6485)

E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889)

E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:400)

E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269)

E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432)

E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:218)

E/AndroidRuntime(1518):在 android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:28)

E/AndroidRuntime(1518):在 android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:60)

E/AndroidRuntime(1518):在 android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:123)

E/AndroidRuntime(1518):在 android.text.method.QwertyKeyListener.onKeyDown(QwertyKeyListener.java:327)

E/AndroidRuntime(1518):在 android.text.method.TextKeyListener.onKeyDown(TextKeyListener.java:132)

E/AndroidRuntime(1518):在 android.widget.TextView.doKeyDown(TextView.java:4433)

E/AndroidRuntime(1518):在 android.widget.TextView.onKeyDown(TextView.java:4267)

E/AndroidRuntime(1518):在 android.view.KeyEvent.dispatch(KeyEvent.java:1256)

E/AndroidRuntime(1518):在 android.view.View.dispatchKeyEvent(View.java:3855)

E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)

E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)

E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)

E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)

E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)

E/AndroidRuntime(1518):在 android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)

E/AndroidRuntime(1518):在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)

E/AndroidRuntime(1518):在 com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)

E/AndroidRuntime(1518):在 android.app.Activity.dispatchKeyEvent(Activity.java:2073)

E/AndroidRuntime(1518):在 com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)

E/AndroidRuntime(1518):在 android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)

E/AndroidRuntime(1518):在 android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)

E/AndroidRuntime(1518):在 android.view.ViewRoot.handleMessage(ViewRoot.java:1867)

E/AndroidRuntime(1518):在 android.os.Handler.dispatchMessage(Handler.java:99)

E/AndroidRuntime(1518): 在 android.os.Looper.loop(Looper.java:123)

E/AndroidRuntime(1518):在 android.app.ActivityThread.main(ActivityThread.java:3683)

E/AndroidRuntime(1518):在 java.lang.reflect.Method.invokeNative(Native Method)

E/AndroidRuntime(1518):在 java.lang.reflect.Method.invoke(Method.java:507)

E/AndroidRuntime(1518):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

E/AndroidRuntime(1518):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

E/AndroidRuntime(1518): 在 dalvik.system.NativeStart.main(Native 方法)

W/ActivityManager(74):强制完成活动 com.jaylefler.contacts/.SearchContacts

W/ActivityManager(74):活动暂停超时 HistoryRecord{4086e540 com.jaylefler.contacts/.SearchContacts}

I/Process (1518):发送信号。 PID:1518 SIG:9

I/ActivityManager(74):处理 com.jaylefler.contacts (pid 1518) 已经死了。

E/InputDispatcher(74):通道'409a83e8 com.jaylefler.contacts/com.jaylefler.contacts.ContactProjectActivity (server)' ~ 消费者关闭输入通道或发生错误。 事件=0x8

E/InputDispatcher(74):通道'409a83e8 com.jaylefler.contacts/com.jaylefler.contacts.ContactProjectActivity (server)' ~ 频道已无法恢复,将被销毁!

I/WindowManager(74): 赢得死亡: Window{4086ff40 com.jaylefler.contacts/com.jaylefler.contacts.SearchContacts 暂停=假}

I/WindowManager(74): 赢得死亡: Window{409a83e8 com.jaylefler.contacts/com.jaylefler.contacts.ContactProjectActivity 暂停=假}

E/InputDispatcher(74): 收到虚假接收回调 未知输入通道。 fd=150,事件=0x8

W/InputManagerService(74): 发送 RemoteException setActive(false) 通知 pid 1518 uid 10030

【问题讨论】:

  • 如何添加 logcat 输出?
  • 好的,这是我发生错误时的 logcat 输出:
  • 顺便说一句,当使用 String 操作时,您已经不再需要使用 toString() 了。
  • Bingo:我敢打赌,它是 substring(0,1)。您是否尝试过 slkorolev 的建议?
  • 我在代码前面加上 if (searchName.getText().toString().length() != 0) 并且能够让事情正常工作:-)

标签: android


【解决方案1】:

我认为问题在于您使用 '==' 将 searchName 文本与空字符串进行比较。这样的比较总是会产生错误的。改用 equals 方法或将文本长度与 0 进行比较。

【讨论】:

  • +1 对我来说即使在 Java 使用了这么多年之后也忽略了这一点...... :)
  • @Dave seekString.substring(0,1) 在这种情况下会崩溃。
  • 当我们在这里的时候:可以使用 str.length() == 0 更快地检查空字符串,并且更不容易出错
  • @HannoBinder 同意,但这是行为上的副作用。
  • @Dave 即使我们称其为“行为副作用”,这也是问题的原因:)
【解决方案2】:

首先,您是否尝试过调试您的应用程序? 您可以使用 logcat 查看引发了什么异常(打开它:Window > Show view > Other, Android > Logcat)。

好吧,我想你的问题是,如果你只是按退格键,你正试图对一个空字符串进行子串化。实际上,在读取它之后就创建一个 seekString 的子字符串,而不检查它是否为空。 可能您必须检查 seekString 是否不为空,然后尝试创建子字符串。

实际上 substring 函数的帮助说可能会引发一个异常: IndexOutOfBoundsException - 如果 beginIndex 为负数或大于此 String 对象的长度。

【讨论】:

  • 你为什么 (a) 认为有一个退格键(不确定它怎么可能来自文本字段,它只会删除字符)或 (b) 认为这会导致异常?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多