免责声明:我是AP计算机科学专业的初学者。
我正在尝试创建一个应用程序,将用户的文本输入转换为猪拉丁语,以便进行练习。这是一项正在进行的工作,但到目前为止,我正在获得例外。
这是我的代码:
package com.example.ashavolian.piglatin2;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View.OnClickListener;
public class MainActivity extends AppCompatActivity {
TextView txtOut;
EditText txtIn;
Button button;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtOut = (TextView) findViewById(R.id.txtOut);
txtIn = (EditText) findViewById(R.id.txtIn);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String txtTxtIn = txtIn.getText().toString();
txtOut.setText(translate(txtTxtIn));
}
});
}
public String translate(String txtTxtIn)
{
txtTxtIn += " ";
int length = txtTxtIn.length();
String pigLatin = " ";
for (int b = 0; b < length; b++) {
int space = txtTxtIn.indexOf(" ");
String word = txtTxtIn.substring(0, space);
int a = word.indexOf("a");
int e = word.indexOf("e");
int i = word.indexOf("i");
int o = word.indexOf("o");
int u = word.indexOf("u");
int vowels[] = {a, e, i, o, u};
for (int c = 0; c < 4; c++)
{
if (vowels[c] == -1)
vowels[c] += 101;
}
for (int d = 0; d < 4; d++)
{
if (vowels[d] > -1 && vowels[d] <= vowels[0] && vowels[d] <= vowels[1] && vowels[d] <= vowels[2] && vowels[d] <= vowels[3] && vowels[d] <= vowels[4])
{
word = word.substring(vowels[i] + 1) + word.substring(0,vowels[i]);
pigLatin += " " + word;
}
}
txtTxtIn = txtTxtIn.substring(space + 1);
}
return pigLatin;
}
}
只有按下按钮才会出现例外情况。使程序崩溃。
以下是例外:
FATAL EXCEPTION: main
Process: com.example.ashavolian.piglatin2, PID: 2991
java.lang.StringIndexOutOfBoundsException: length=0; regionStart=0; regionLength=-1
at java.lang.String.startEndAndLength(String.java:298)
at java.lang.String.substring(String.java:1087)
at com.example.ashavolian.piglatin2.MainActivity.translate(MainActivity.java:39)
at com.example.ashavolian.piglatin2.MainActivity$1.onClick(MainActivity.java:27)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
答案 0 :(得分:1)
我想,当您尝试使用索引访问数组中的元素时会抛出异常,而索引实际上并不存在。当您获得IndexOutOfBoundsException
或StringIndexOutOfBoundsException
时,这是典型的情况。
如果没有调试应用程序,我无法告诉你哪一行是一个真正的错误。你的translate(String)
方法做的很奇怪,代码也不那么干净。不过,我有以下候选人,可能会导致例外:
vowels[i]
- i
变量由int i = word.indexOf("i");
计算,而word
由txtTxtIn.substring(0, space);
计算,但您无法确定{{1}的长度但是,txtxTxtIn
的最大索引是4.当vovels
的字符数多于5时,将抛出异常txtTxtIn
- 此处可能与上述类似我的建议是调试此代码。此外,您可以使用txtTxtIn = txtTxtIn.substring(space + 1);
。它是Java,我们在这里有这样的结构。对字符串和字符执行操作会更容易,并且更难以犯这样的错误。
答案 1 :(得分:0)
以下代码中的变量i是问题所在。
word = word.substring(vowels[i] + 1) + word.substring(0,vowels[i]);
检查您是否需要变量i或其他变量。