我的应用在模拟器中工作正常,但当我在真实设备上安装它时会崩溃。
经过一些调试后,我发现错误发生在子字符串函数中。
这是我认为导致问题的代码。
if(text.indexOf(" ")>0 && text.indexOf("d")>0) {
a = text.indexOf(" ");
b = text.indexOf("d");
}
ccs = text.substring(0,a);
crs = text.substring(a+1,b);
days = text.substring(b + 1);
例如,如果text =" 30 100d27&#34 ;; ccs =" 30",crs =" 100"和天=" 27"
为什么这样的东西会在模拟器上按预期工作但在真实设备上崩溃?
答案 0 :(得分:0)
我将在联想k900中尝试此代码,它的工作正常。 如果您有疑问,请将其放入试试块中。
try {
text = "30 100d27";
if (text.indexOf(" ") > 0 && text.indexOf("d") > 0) {
a = text.indexOf(" ");
b = text.indexOf("d");
}
ccs = text.substring(0, a);
crs = text.substring(a + 1, b);
days = text.substring(b + 1);
} catch (Exception e) {
Log.e("mye", "exception " + e);
}
如果您的数据类似于此文字=" 30100d27"比它给你 java.lang.StringIndexOutOfBoundsException 所以最后检查你的输入。
答案 1 :(得分:0)
我不知道确切的崩溃原因,因为您没有提供任何错误日志或相等的
但我可以给你这个:
成像一个字符串"dexample01 "
(末尾的空格)。
现在运行您的代码,您将遇到异常:
text = "dexample01 ";
if (text.indexOf(" ") > 0 && text.indexOf("d") > 0) {
a = text.indexOf(" "); //a = 9
b = text.indexOf("d");
}
ccs = text.substring(0,a);
crs = text.substring(a+1,b); // a+1 = 10 -> 10 causes INDEX OUT OF BOUNDS
days = text.substring(b + 1);
也许你遇到了这个特殊情况,因为你的应用程序崩溃了。
答案 2 :(得分:0)
以此为例(它使用split()而不是indexof()):
public class Demo3 extends AppCompatActivity {
private EditText edt;
private Button b;
private TextView tv;
private String ccs;
private String crs;
private String days;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo3);
edt = (EditText) findViewById(R.id.edt);
tv = (TextView) findViewById(R.id.tv);
b = (Button) findViewById(R.id.b);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!edt.getText().toString().isEmpty()){
String[] split_space = edt.getText().toString().split(" ");
if(split_space.length==2){
ccs = split_space[0];//TODO: check ccs is a number
if(!split_space[1].isEmpty()){
String[] split_d = split_space[1].split("d");
if(split_d.length ==2 ){
crs = split_d[0];//TODO: check crs is a number
days = split_d[1];//TODO: check days is a number
}else{
crs = "null";
days = "null";
}
}else{
crs = "null";
days = "null";
}
}else{
ccs = "null";
crs = "null";
days = "null";
}
}else{
ccs = "null";
crs = "null";
days = "null";
}
tv.setText("ccs = " + ccs +"---" + "crs = " + crs + "---" + "days = " + days);
}
});
}
}
demo3.xml:----
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edt"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="null"
android:id="@+id/tv"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Check"
android:layout_marginTop="50dp"
android:id="@+id/b"/>
</LinearLayout>