2014-02-05 98 views
1

我正在構建一個簡單的計算器,但由於某種原因,只要我按下按鈕,它就會崩潰。請幫助我。簡單的android計算器應用程序崩潰

這是我的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監聽器。現在每當我按下按鈕,我的程序崩潰。請幫助我解決它。謝謝。

+1

發佈您的logcat – user2450263

+0

您尚未在您的活動類中定義任何按鈕。 – DroidDev

+0

究竟是哪裏出錯,併發布您的日誌貓的詳細信息。 – Yugesh

回答

0

有些事情應該導致你的應用程序崩潰:

正如你不會在你的情況下,最終使用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 = "";。這將修復Exception,但它不是非常用戶友好的。

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」,這是對用戶更友好。

+0

做到了這一點,因爲你說,仍然沒有工作.. :( –

+0

你採取了我提供的代碼?我測試了它,它的工作原理! – chuky

+0

我做了同樣的方式,你說,但仍然沒有。?運行的應用程序崩潰 –

0

第一變化num=Integer.valueOf(display).intValue();

TO

num=Integer.parse(display); 

和改變display=Integer.toString(i);

TO

display=String.valueOf(i); 
+0

。 ( –

0

此代碼是當我學習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(); 
    } 
} 
} 

注:我不記得,如果代碼是否完整,或者它是否正確運行,正如它在一年前寫的那樣。