(単純な) 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) と妹の Samsung Galaxy S2 (Android 4.1.2)で生成され、ほとんどのデバイスでも生成されると思います。
しかし、私の LG Optimus Chic (Android 2.2) では停止します (無限ループの疑いがあります)。
古い LG Optimus Chic と Android 2.2 にはバグがある可能性があります。(String.replace()
実際にはバグがあります。)しかし、コードの一部はString.replace()
比較的単純です-「単純」とは、動的バインディング、スレッドなどがないことを意味します...
そのコードはコンパイル時にファイナライズする必要がありますか? Javaコンパイラはどのように機能しますか(Javaはクロスプラットフォーム言語であるため、動作が異なる場合があります)?
.apk
PSは、コンパイルされたコードと同じであることを確認するために、Eclipseを使用してデバイスで直接実行するのではなく、実際にUSBでコンパイルしたものをAndroid携帯に転送しました。
Android 2.2 Froyo のソース コードを見つけました。
の場合、無限ループが発生しますtarget.length == 0
( ではdo-while loop
、string.indexOf("", tail)
が戻らない-1
ため)。
疑問が少し解消されました。しかし...