子串函数崩溃设备上的应用程序(但不在模拟器上)

时间:2018-04-03 08:49:29

标签: javascript android

我的应用在模拟器中工作正常,但当我在真实设备上安装它时会崩溃。

经过一些调试后,我发现错误发生在子字符串函数中。

这是我认为导致问题的代码。

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"

为什么这样的东西会在模拟器上按预期工作但在真实设备上崩溃?

3 个答案:

答案 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>