为什么同一段(简单)Java 代码在不同的 Android 设备上表现得非常不同?
那段简单的代码只是使用String.replace(CharSequence target, CharSequence replacement)
with target == ""
:
package com.example.stringreplacetest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = "just_a_string";
System.out.println(str.replace("", "-"));
((TextView) findViewById(R.id.textView)).setText(str.replace("", "-"));
}
}
它-j-u-s-t-_-a-_-s-t-r-i-n-g-
在我的 LG Optimus 3D P920 (Android 2.3.3) 和我姐姐的三星 Galaxy S2 (Android 4.1.2)上产生,我猜你的大多数设备也是如此。
但它在我的 LG Optimus Chic(Android 2.2)上停止(怀疑无限循环)。
旧的 LG Optimus Chic 和 Android 2.2 可能有问题。(String.replace()
确实有一个错误。)但是其中的代码String.replace()
相对简单-“简单”意味着没有动态绑定,没有线程等......
那段代码不应该在编译时完成吗?Java 编译器是如何工作的(我知道 Java 是一种跨平台语言,它的工作方式可能不同)?
PS为了确保它是同一段编译代码,我实际上将.apk
通过USB编译的代码转移到我的Android手机上,而不是使用Eclipse直接在设备中运行它们。
我找到了 Android 2.2 Froyo 的源代码:
它确实会导致无限循环 when target.length == 0
(因为在do-while loop
,string.indexOf("", tail)
永远不会返回-1
)。
疑虑已经消除了一些。但...