简单的 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()-方法。

编辑:

我找到了崩溃的原因:这是在这一行中抛出的NumberFormatExceptionnum = 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 中的简单计算器应用程序不断关闭

简单线程使 Android 应用程序崩溃

如何停止通过 buildozer 制作的 android 上的 kivy 应用程序崩溃。这些在计算机上运行良好

尽管它很简单,但Android应用程序不会停止崩溃[重复]

Xamarin.Android 使用 ApkTool 编辑 apk 包名称导致崩溃