Java 安卓工作室-语音搜索-在说2号和4号时崩溃

Java 安卓工作室-语音搜索-在说2号和4号时崩溃,java,android,text-to-speech,voice,Java,Android,Text To Speech,Voice,我有一个具有语音功能的活动。这让你说出4个单词,这些单词被添加到一个数组中。我只想要第二个和最后一个字 我将第二个字转换成字符串,最后一个字转换成整数(最后一个字总是1-5之间的数字) 只要我不说2或4,代码就可以正常工作。我一说出这两个数字,应用程序就崩溃了 我怎样才能解决这个问题 我试着考虑插入一个if语句。例如,如果字符串包含单词for,则它=4。(粗略代码) 我已经在下面发布了代码和堆栈跟踪 public class Report extends AppCompatActivity {

我有一个具有语音功能的活动。这让你说出4个单词,这些单词被添加到一个数组中。我只想要第二个和最后一个字

我将第二个字转换成字符串,最后一个字转换成整数(最后一个字总是1-5之间的数字)

只要我不说2或4,代码就可以正常工作。我一说出这两个数字,应用程序就崩溃了

我怎样才能解决这个问题

我试着考虑插入一个if语句。例如,如果字符串包含单词for,则它=4。(粗略代码)

我已经在下面发布了代码和堆栈跟踪

public class Report extends AppCompatActivity {

private static final int REQ_CODE_SPEECH_INPUT = 100;
private TextView mVoiceInputTv;
private ImageButton mSpeakBtn;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.report);


    mVoiceInputTv = (TextView) findViewById(R.id.voiceInput);
    mSpeakBtn = (ImageButton) findViewById(R.id.btnSpeak);
    mSpeakBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            startVoiceInput();
        }
    });

    final String carreg = mVoiceInputTv.getText().toString();


}

private void startVoiceInput() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "e.g- Report fpg563 rating 3");
    try {
        startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
    } catch (ActivityNotFoundException a) {

    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {
                ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                mVoiceInputTv.setText(result.get(0));

            }
            break;
        }

    }
    if(mVoiceInputTv.getText().toString().contains("report")) {
        input();

    }
}


public void input() {

    String test = mVoiceInputTv.getText().toString();
    String[] ms = test.split(" ");
    List<String> selectedWords = new ArrayList<>();

    for (int i = 0; i < ms.length; i++) {
        selectedWords.add(ms[i]);


        final String carreg = ms[1];
        final String newrating = ms[3];
        final int rating = Integer.parseInt(newrating);





        Response.Listener<String> responseListener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    JSONObject jsonResponse = new JSONObject(response);
                    boolean success = jsonResponse.getBoolean("success");
                    if (success) {
                        Intent intent = new Intent(Report.this, Report.class);
                        Report.this.startActivity(intent);
                    } else {
                        AlertDialog.Builder builder = new AlertDialog.Builder(Report.this);
                        builder.setMessage("Reporting Failed")
                                .setNegativeButton("Retry", null)
                                .create()
                                .show();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }


        };
        Report_request registerRequest = new Report_request(carreg, rating, responseListener);
        RequestQueue queue = Volley.newRequestQueue(Report.this);
        queue.add(registerRequest);
    }
}

}

这是怎么回事?我在问一个诚实的问题。当然,语法可能不好。但是我还在学英语。你想让我在发帖之前先去上英语课吗

这一定发生了,因为2也是“to”或“too”这个词,除非您捕捉到这些情况,否则它不能转换为int。类似地,正如您所指出的,4可能被转换为单词“for”,除非您特别注意到这种情况,否则它也不会转换为int

我认为你的思路是对的,在这种情况下,语音文字转换会给你一个听起来像数字但不是一的单词

但是,如果您希望代码不会崩溃,则需要为任何可能的输入做好准备。因此,如果抛出异常,您应该捕获它,然后做正确的事情

try {
    final int rating = Integer.parseInt(newrating);
} catch ( NumberFormatException e ) {
    //uhoh couldn't get the number 
    //prompt the user to try again or 
    //do something else that makes sense
}

堆栈跟踪中有什么,请共享。(没有否决票)堆栈跟踪是什么意思?我还在学java。所以我不太清楚你的意思。在问下一个问题之前,你最好先读一下这篇文章;请了解它(异常处理),如果不处理异常,就无法编写任何有用的代码。在您的上述问题中,请捕获
java.lang.NumberFormatException
,并向用户显示一些友好的消息,并要求他们更正输入。由于您在问题中付出了努力,并使其正确,我对其进行了编辑和升级。您是个聪明人:)捕获泛型异常并不总是好的,特别是如果您知道引发的异常。更新了parseInt(NumberFormatException)引发的特定异常的答案yea。我还是有同样的问题。是否可以执行if语句?例如将数组[3](最后一个字)添加到字符串中。如果字符串包含单词for,则创建一个数字为4的新int值。类似的事情?哦,我用if语句修复了它:)
try {
    final int rating = Integer.parseInt(newrating);
} catch ( NumberFormatException e ) {
    //uhoh couldn't get the number 
    //prompt the user to try again or 
    //do something else that makes sense
}