【问题标题】:Simple android calculator application crashes简单的 android 计算器应用程序崩溃
【发布时间】: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 属性,此处。
  • 您的情况没有任何中断...

标签: java android xml


【解决方案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_width="match_parent"
        android:layout_height="match_parent"
        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_height="2px"
            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();
        }
    }
    }
    

    注意:我不记得代码是否完整,或者它是否运行正常,因为它是一年前写的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多