简单的 android 计算器应用程序崩溃
Posted
技术标签:
【中文标题】简单的 android 计算器应用程序崩溃【英文标题】:Simple android calculator application crashes 【发布时间】:2014-03-01 20:54:46 【问题描述】:我正在构建一个简单的计算器,但由于某种原因,我一按下按钮它就会崩溃。请帮帮我。
这是我的 Calculator.java 类。
package com.dexter.seemab;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class Calculator extends Activity
String display="";
Character op = 'q';
int i,num,numtemp;
int check=0;
EditText rd;
@Override
protected void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.calculator);
rd=(EditText)findViewById(R.id.etResult);
public void btnClicked(View v)
switch(v.getId())
case R.id.one:
insert(1);
case R.id.two:
insert(2);
case R.id.three:
insert(3);
case R.id.four:
insert(4);
case R.id.five:
insert(5);
case R.id.six:
insert(6);
case R.id.seven:
insert(7);
case R.id.eight:
insert(8);
case R.id.nine:
insert(9);
case R.id.zero:
insert(0);
case R.id.add:
perform();
op='+';
case R.id.sub:
perform();
op='-';
case R.id.product:
perform();
op='*';
case R.id.difference:
perform();
op='/';
case R.id.equals:
calculate();
case R.id.clear:
clear();
public void insert(int digit)
if (check==1)
clear();
display=display+Integer.toString(digit);
num=Integer.valueOf(display).intValue();
rd.setText(display);
check=0;
public void perform()
numtemp=num;
display=display+op.toString();
public void calculate()
switch(op)
case '+':
i=num+numtemp;
case '-':
i=num-numtemp;
case '*':
i=num*numtemp;
case '/':
i=num/numtemp;
display=Integer.toString(i);
rd.setText("="+display);
check=1;
public void clear()
op='q';
num=0;
numtemp=0;
i=0;
display="";
rd.setText(display);
我的按钮包含一个指向方法 btnClicked() 的 onClick 侦听器。现在每当我按下一个按钮,我的程序就会崩溃。请帮我解决它。谢谢。
【问题讨论】:
您尚未在活动类中定义任何按钮。 您在哪里得到错误并发布您的 log-cat 详细信息。 我的按钮包含一个 onClick 监听器,它指向方法 btnClicked().----- 按钮和单击监听器在哪里,在程序崩溃之前抛出什么错误,来帮助你,大家必须知道 @user2450263, @VishwasSharma 显然 SO 指的是设置为btnClicked
的 xml 按钮中的 onClick
属性,此处。
您的情况没有任何中断...
【参考方案1】:
先改num=Integer.valueOf(display).intValue();
到
num=Integer.parse(display);
并更改display=Integer.toString(i);
到
display=String.valueOf(i);
【讨论】:
【参考方案2】:有些事情应该会导致您的应用崩溃:
由于您在案例结束时不使用break
-statements,因此从与您的按钮ID 匹配到最后一个语句(R.id.clear
)的每个案例都将被执行。这当然是您应该解决的意外行为。
进一步num / numtemp
是错误的,因为 numtemp 代表第一个输入的数字,而 num 代表最后一个数字。
这是您的固定代码。请阅读以下导致异常的原因:
package com.dexter.seemab;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class Calculator extends Activity
String display = "";
Character op = 'q';
int i, num, numtemp;
int check = 0;
EditText rd;
@Override
protected void onCreate(Bundle savedInstanceState)
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.calculator);
rd = (EditText) findViewById(R.id.etResult);
public void btnClicked(View v)
switch (v.getId())
case R.id.one:
insert(1);
break;
case R.id.two:
insert(2);
break;
case R.id.three:
insert(3);
break;
case R.id.four:
insert(4);
break;
case R.id.five:
insert(5);
break;
case R.id.six:
insert(6);
break;
case R.id.seven:
insert(7);
break;
case R.id.eight:
insert(8);
break;
case R.id.nine:
insert(9);
break;
case R.id.zero:
insert(0);
break;
case R.id.add:
op = '+';
perform();
break;
case R.id.sub:
op = '-';
perform();
break;
case R.id.product:
op = '*';
perform();
break;
case R.id.difference:
op = '/';
perform();
break;
case R.id.equals:
calculate();
break;
case R.id.clear:
clear();
break;
public void insert(int digit)
if (check == 1)
clear();
display = display + Integer.toString(digit);
if(op == 'q')
num = Integer.valueOf(display).intValue();
else
String[] digits = display.split("\\"+op.toString());
num = Integer.valueOf(digits[digits.length-1]);
rd.setText(display);
check = 0;
public void perform()
numtemp = num;
display = display + op.toString();
public void calculate()
switch (op)
case '+':
i = numtemp + num;
break;
case '-':
i = numtemp - num;
break;
case '*':
i = numtemp * num;
break;
case '/':
i = numtemp / num;
break;
display = Integer.toString(i);
rd.setText("=" + display);
check = 1;
public void clear()
op = 'q';
num = 0;
numtemp = 0;
i = 0;
display = "";
rd.setText(display);
另一个提示:您的计算器无法执行像3+4-5
这样的简单任务。如果您想计算这些术语,您必须至少更改 perform()
-方法。
编辑:
我找到了崩溃的原因:这是在这一行中抛出的NumberFormatException
:num = Integer.valueOf(display).intValue();
。当您单击运算符后的第一个数字时,它会发生(使用我更正的代码)。发生这种情况是因为无法将 12+8
之类的内容解析为 int。所以你有两个选择来解决这个问题:
1) 在方法perform
中:将display = display + op.toString();
更改为display = "";
。这将修复异常,但它不是非常用户友好。
2) 在方法insert
中:将num = Integer.valueOf(display).intValue();
更改为
if(op == 'q')
num = Integer.valueOf(display).intValue();
else
String[] digits = display.split("\\"+op.toString());
num = Integer.valueOf(digits[digits.length-1]);
这样您的EditText
将显示类似“12+52”的文本,这样对用户更友好。
【讨论】:
我按照你说的方法做了。但仍然无法正常工作。应用程序崩溃。 什么异常会崩溃? 如何查看异常? 它在您的 LogCat 的堆栈跟踪中。如果你使用eclipse可以如下打开:Window->Show View->Other->LogCat->OK 感谢您的帮助。我能够在 logcat 的帮助下确定问题。我在 xml 文件中做错了,onclick 方法没有被正确调用。再次感谢您的帮助。【参考方案3】:这段代码是我在学习Android应用程序开发的时候写的,现在分享给大家。或许你可以从这里得到一些想法,希望对你有所帮助:
布局:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:stretchColumns="*" >
<TableRow>
<EditText
android:id="@+id/editText"
android:layout_span="4"
android:editable="false"
android:gravity="right"
android:hint="Your text here..." />
</TableRow>
<View
android:layout_
android:background="#00ff00" />
<TableRow>
<Button
android:id="@+id/button1"
android:text="1" />
<Button
android:id="@+id/button2"
android:text="2" />
<Button
android:id="@+id/button3"
android:text="3" />
<Button
android:id="@+id/buttonAdd"
android:text="+" />
</TableRow>
<TableRow>
<Button
android:id="@+id/button4"
android:text="4" />
<Button
android:id="@+id/button5"
android:text="5" />
<Button
android:id="@+id/button6"
android:text="6" />
<Button
android:id="@+id/buttonSub"
android:text="-" />
</TableRow>
<TableRow>
<Button
android:id="@+id/button7"
android:text="7" />
<Button
android:id="@+id/button8"
android:text="8" />
<Button
android:id="@+id/button9"
android:text="9" />
<Button
android:id="@+id/buttonMul"
android:text="*" />
</TableRow>
<TableRow>
<Button
android:id="@+id/button0"
android:layout_span="2"
android:text="0" />
<Button
android:id="@+id/buttonClear"
android:text="Clr" />
<Button
android:id="@+id/buttonDiv"
android:text="/" />
</TableRow>
<TableRow>
<Button
android:id="@+id/buttonEqu"
android:layout_span="2"
android:text="=" />
<Button
android:id="@+id/buttonCan"
android:text="C" />
<Button
android:id="@+id/buttonPow"
android:text="^" />
</TableRow>
</TableLayout>
活动:
public class MyFirstCalculator extends Activity implements OnClickListener
/** Called when the activity is first created. */
Button btn0,btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9;
Button btnAdd,btnSub,btnMul,btnDiv,btnPow,btnEqu,btnCan,btnClr;
EditText editText;
Double oldValue;
char chOp=' ';
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText=(EditText) findViewById(R.id.editText);
btn0 = (Button)findViewById(R.id.button0);
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
btn3 = (Button)findViewById(R.id.button3);
btn4 = (Button)findViewById(R.id.button4);
btn5 = (Button)findViewById(R.id.button5);
btn6 = (Button)findViewById(R.id.button6);
btn7 = (Button)findViewById(R.id.button7);
btn8 = (Button)findViewById(R.id.button8);
btn9 = (Button)findViewById(R.id.button9);
btnAdd = (Button)findViewById(R.id.buttonAdd);
btnSub = (Button)findViewById(R.id.buttonSub);
btnMul = (Button)findViewById(R.id.buttonMul);
btnDiv = (Button)findViewById(R.id.buttonDiv);
btnPow = (Button)findViewById(R.id.buttonPow);
btnEqu = (Button)findViewById(R.id.buttonEqu);
btnCan = (Button)findViewById(R.id.buttonCan);
btnClr = (Button)findViewById(R.id.buttonClear);
btn0.setOnClickListener(this);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
btn6.setOnClickListener(this);
btn7.setOnClickListener(this);
btn8.setOnClickListener(this);
btn9.setOnClickListener(this);
btnAdd.setOnClickListener(this);
btnSub.setOnClickListener(this);
btnDiv.setOnClickListener(this);
btnMul.setOnClickListener(this);
btnPow.setOnClickListener(this);
btnEqu.setOnClickListener(this);
btnCan.setOnClickListener(this);
btnClr.setOnClickListener(this);
public void onClick(View v)
try
Button btn = (Button)v;
Double answer, curValue;
switch(v.getId())
case R.id.button0:
case R.id.button1:
case R.id.button2:
case R.id.button3:
case R.id.button4:
case R.id.button5:
case R.id.button6:
case R.id.button7:
case R.id.button8:
case R.id.button9:
editText.setText(editText.getText()+""+btn.getText()+"");
break;
case R.id.buttonAdd:
case R.id.buttonSub:
case R.id.buttonMul:
case R.id.buttonDiv:
case R.id.buttonPow:
if(editText.getText()+"" == "")
return;
chOp=(btn.getText()+"").charAt(0);
oldValue=Double.parseDouble(editText.getText()+"");
editText.setText("");
break;
case R.id.buttonCan:
oldValue=0.0;
editText.setText("");
break;
case R.id.buttonClear:
int len = (editText.getText()+"").length();
if(len==0)
Toast.makeText(getApplicationContext(), "Nothing to erase...", Toast.LENGTH_LONG).show();
else
editText.setText((editText.getText()+"").substring(0, len-1));
break;
case R.id.buttonEqu:
if(editText.getText()+"" == "")
return;
curValue = Double.parseDouble(editText.getText()+"");
switch (chOp)
case '+':
answer = oldValue+curValue;
editText.setText(answer+"");
break;
case '-':
answer=oldValue-curValue;
editText.setText(answer+"");
break;
case '*':
answer=oldValue*curValue;
editText.setText(answer+"");
break;
case '/':
answer=oldValue/curValue;
editText.setText(answer+"");
break;
case '^':
answer=Math.pow(oldValue, curValue);
editText.setText(answer+"");
break;
catch (Exception e)
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
注意:我不记得代码是否完整,或者它是否运行正常,因为它是一年前写的。
【讨论】:
以上是关于简单的 android 计算器应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Google Maps Android API v2 - 简单的地图应用程序崩溃
Android Studio 中的简单计算器应用程序不断关闭