【发布时间】:2014-05-15 11:01:29
【问题描述】:
我正在尝试创建一个计算器应用程序。为了避免重复运算符,我正在检查字符串中的前一个字符是否是运算符。但是当我输入第三个字符时,我得到了 stringindexoutofboundsexception。
package com.example.calculatorproject;
import android.app.Activity;
import android.os.Bundle;
import android.text.InputType;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
public class MainActivity extends Activity {
EditText txtresult;
ImageButton ib_backspace;
String result="";
char value;
Button btnc,btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn0,btn_add,btn_sub,btn_multi,btn_divide,btn_decimal,btn_equal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtresult=(EditText) findViewById(R.id.txtresult);
ib_backspace=(ImageButton) findViewById(R.id.ib_backspace);
txtresult.setInputType(InputType.TYPE_NULL);
btnc=(Button) findViewById(R.id.btnC);
btn1=(Button) findViewById(R.id.btn1);
btn2=(Button) findViewById(R.id.btn2);
btn3=(Button) findViewById(R.id.btn3);
btn4=(Button) findViewById(R.id.btn4);
btn5=(Button) findViewById(R.id.btn5);
btn6=(Button) findViewById(R.id.btn6);
btn7=(Button) findViewById(R.id.btn7);
btn8=(Button) findViewById(R.id.btn8);
btn9=(Button) findViewById(R.id.btn9);
btn0=(Button) findViewById(R.id.btn0);
btn_add=(Button) findViewById(R.id.btn_add);
btn_sub=(Button) findViewById(R.id.btn_sub);
btn_multi=(Button) findViewById(R.id.btn_multi);
btn_divide=(Button) findViewById(R.id.btn_divide);
btn_decimal=(Button) findViewById(R.id.btn_decimal);
btn_equal=(Button) findViewById(R.id.btn_equal);
ib_backspace.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result=txtresult.getText().toString();
if(result.length()!=0)
{
result = result.substring(0, result.length()-1);
setresult();
}
}
});
btnc.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
result="";
setresult();
}
});
btn0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="0";
setresult();
}
});
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="1";
setresult();
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="2";
setresult();
}
});
btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="3";
setresult();
}
});
btn4.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="4";
setresult();
}
});
btn5.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="5";
setresult();
}
});
btn6.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="6";
setresult();
}
});
btn7.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="7";
setresult();
}
});
btn8.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="8";
setresult();
}
});
btn9.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+="9";
setresult();
}
});
btn_add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
value=result.substring(result.length()-1).charAt(result.length()-1);
if((value=='+')||(value=='-')||(value=='*')||(value=='/')||(value=='.'))
{
result=(result.substring(0,result.length()-1))+"+";
setresult();
}
else
{
result+="+";
setresult();
}
}
});
btn_sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
value=result.substring(result.length()-1).charAt(result.length()-1);
if((value=='+')||(value=='-')||(value=='*')||(value=='/')||(value=='.'))
{
result=result.substring(0,result.length()-1)+"-";
setresult();
}
else
{
result+="-";
setresult();
}
}
});
btn_divide.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
value=result.substring(result.length()-1).charAt(result.length()-1);
if((value=='+')||(value=='-')||(value=='*')||(value=='/')||(value=='.'))
{
result=result.substring(0,result.length()-1)+"/";
setresult();
}
else
{
result+="/";
setresult();
}
}
});
btn_multi.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
value=result.substring(result.length()-1).charAt(result.length()-1);
if((value=='+')||(value=='-')||(value=='*')||(value=='/')||(value=='.'))
{
result=result.substring(0,result.length()-1)+"*";
setresult();
}
else
{
result+="*";
setresult();
}
}
});
btn_decimal.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
result+=".";
setresult();
}
});
btn_equal.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
}
public void setresult()
{
txtresult.setText(result);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
例如,如果我输入“9+5-*”作为表达式,* 应该替换 - 符号。但即使我输入 9+5,当我输入 + 时也会出现 stringoutofboundsexception。请帮助!!
日志猫
05-15 06:03:50.317: E/AndroidRuntime(1492): FATAL EXCEPTION: main
05-15 06:03:50.317: E/AndroidRuntime(1492): Process: com.example.calculatorproject, PID: 1492
05-15 06:03:50.317: E/AndroidRuntime(1492): java.lang.StringIndexOutOfBoundsException: length=1; index=2
05-15 06:03:50.317: E/AndroidRuntime(1492): at com.example.calculatorproject.MainActivity$14.onClick(MainActivity.java:175)
05-15 06:03:50.317: E/AndroidRuntime(1492): at android.view.View.performClick(View.java:4424)
05-15 06:03:50.317: E/AndroidRuntime(1492): at android.view.View$PerformClick.run(View.java:18383)
05-15 06:03:50.317: E/AndroidRuntime(1492): at android.os.Handler.handleCallback(Handler.java:733)
05-15 06:03:50.317: E/AndroidRuntime(1492): at android.os.Handler.dispatchMessage(Handler.java:95)
05-15 06:03:50.317: E/AndroidRuntime(1492): at android.os.Looper.loop(Looper.java:137)
05-15 06:03:50.317: E/AndroidRuntime(1492): at android.app.ActivityThread.main(ActivityThread.java:4998)
05-15 06:03:50.317: E/AndroidRuntime(1492): at java.lang.reflect.Method.invokeNative(Native Method)
05-15 06:03:50.317: E/AndroidRuntime(1492): at java.lang.reflect.Method.invoke(Method.java:515)
05-15 06:03:50.317: E/AndroidRuntime(1492): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
05-15 06:03:50.317: E/AndroidRuntime(1492): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
05-15 06:03:50.317: E/AndroidRuntime(1492): at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
-
比较麻烦的一行是 value=result.substring(result.length()-1).charAt(result.length()-1);
-
能否请您在第 174 行记录结果变量的长度,并在此处发布结果?
-
您提供了 261 行代码,其中大部分与问题无关。我怀疑如果您花时间制作一个更短的示例,以便更容易诊断问题,您会自己发现问题。
-
(提示:仔细查看
result.substring(result.length()-1).charAt(result.length()-1);。result.substring(result.length()-1)会持续多久?然后想想你将向charAt提供什么论据。) -
您没有验证结果变量是否为空。只需在每个使用结果变量的方法的开头添加验证
if (result==null || result.length() == 0) return;
标签: java android indexoutofboundsexception