2014-02-13 3 views
6

계산기 디자인을 만들려고합니다. 그러나 컴파일 타임 오류가 없습니다. 마지막으로 프로젝트/코드를 실행하는 동안 nullpointer 예외가 발생했습니다.Android에서 터치 계산기

MainActivity.java :

public class MainActivity extends Activity { 
GridView mKeypadGrid; 
KeyAdapter mKeypadAdapter; 
private TextView userInputText; 
private boolean resetInput; 
private boolean hasFinalResult; 
private String mDecimalSeperator; 
private Stack<String> mInputStack; 
private Stack<String> mOperationStack; 
private double memoryValue; 
private TextView mStackText; 
private TextView memoryStatText; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

userInputText= (TextView) findViewById(R.id.txtInput); 
mStackText=(TextView)findViewById(R.id.txtStack); 
memoryStatText=(TextView)findViewById(R.id.txtMemory); 
mKeypadGrid = (GridView)findViewById(R.id.grdButtons); 

mKeypadAdapter = new KeyAdapter(this); 


mKeypadGrid.setAdapter(mKeypadAdapter); 
mKeypadAdapter.setOnButtonClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Button btn = (Button) v; 

     KeypadButton keypadButton = (KeypadButton) btn.getTag(); 


     ProcessKeypadInput(keypadButton); 
     }}); 
mKeypadGrid.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v,int position, long id) { 

    } 
}); 
} 

public void ProcessKeypadInput(KeypadButton keypadButton) { 

     String text = keypadButton.getText().toString(); 
     String currentInput = userInputText.getText().toString(); 

     int currentInputLen = currentInput.length(); 
     String evalResult = null; 
     double userInputValue = Double.NaN; 

     switch (keypadButton) { 
     case BACKSPACE: 
      if (resetInput) 
       return; 

      int endIndex = currentInputLen - 1; 


      if (endIndex < 1) { 
       userInputText.setText("0"); 
      } 
      else { 
       userInputText.setText(currentInput.subSequence(0, endIndex)); 
      } 
      break; 
     case SIGN: 
      if (currentInputLen > 0 && currentInput != "0") { 

       if (currentInput.charAt(0) == '-') { 
        userInputText.setText(currentInput.subSequence(1, 
          currentInputLen)); 
       } 

       else { 
        userInputText.setText("-" + currentInput.toString()); 
       } 
      } 
      break; 
     case CE: 
      userInputText.setText("0"); 
      break; 
     case C: 
      userInputText.setText("0"); 
      clearStacks(); 
      break; 
     case DECIMAL_SEP: 
      if (hasFinalResult || resetInput) { 
       userInputText.setText("0" + mDecimalSeperator); 
       hasFinalResult = false; 
       resetInput = false; 
      } else if (currentInput.contains(".")) 
       return; 
      else 
       userInputText.append(mDecimalSeperator); 
      break; 
     case DIV: 
     case PLUS: 
     case MINUS: 
      case MULTIPLY: 
      if (resetInput) { 
       mInputStack.pop(); 
       mOperationStack.pop(); 
      } else { 
       if (currentInputLen >0) { 
        if (currentInput.charAt(0) == '-') { 

       } else { 
        if(currentInput!=null) 
        mInputStack.add(currentInput); 
       } 
       mOperationStack.add(currentInput); 
      } 
      } 
      if(text!=null){ 
      mInputStack.add(text); //132nd Line 
      mOperationStack.add(text); 
      } 
      dumpInputStack(); 
      evalResult = evaluateResult(false); 
      if (evalResult != null) 
       userInputText.setText(evalResult); 

      resetInput = true; 
      break; 
     case CALCULATE: 
      if (mOperationStack.size() == 0) 
       break; 

      mOperationStack.add(currentInput); 
      evalResult = evaluateResult(true); 
      if (evalResult != null) { 
       clearStacks(); 
       userInputText.setText(evalResult); 
       resetInput = false; 
       hasFinalResult = true; 
      } 
      break; 
     case M_ADD: 
      userInputValue = tryParseUserInput(); 
      if (Double.isNaN(userInputValue)) 
       return; 
      if (Double.isNaN(memoryValue)) 
       memoryValue = 0; 
      memoryValue += userInputValue; 
      displayMemoryStat(); 

      hasFinalResult = true; 

      break; 
     case M_REMOVE: 
      userInputValue = tryParseUserInput(); 
      if (Double.isNaN(userInputValue)) 
       return; 
      if (Double.isNaN(memoryValue)) 
       memoryValue = 0; 
      memoryValue -= userInputValue; 
      displayMemoryStat(); 
      hasFinalResult = true; 
      break; 
     case MC: 
      memoryValue = Double.NaN; 
      displayMemoryStat(); 
      break; 
     case MR: 
      if (Double.isNaN(memoryValue)) 
       return; 
      userInputText.setText(doubleToString(memoryValue)); 
      displayMemoryStat(); 
      break; 
     case MS: 
      userInputValue = tryParseUserInput(); 
      if (Double.isNaN(userInputValue)) 
       return; 
      memoryValue = userInputValue; 
      displayMemoryStat(); 
      hasFinalResult = true; 
      break; 
     default: 
      if (Character.isDigit(text.charAt(0))) { 
       if (currentInput.equals("0") || resetInput || hasFinalResult) { 
        userInputText.setText(text); 
        resetInput = false; 
        hasFinalResult = false; 
       } else { 
        userInputText.append(text); 
        resetInput = false; 
       } 

      } 
      break; 

     } 

    } 

    public void clearStacks() { 
     mInputStack.clear(); 
     mOperationStack.clear(); 
     mStackText.setText(""); 
    } 

    public void dumpInputStack() { 
     Iterator<String> it = mInputStack.iterator(); 
     StringBuilder sb = new StringBuilder(); 

     while (it.hasNext()) { 
      CharSequence iValue = it.next(); 
      sb.append(iValue); 

     } 

     mStackText.setText(sb.toString()); 
    } 

    public String evaluateResult(boolean requestedByUser) { 
     if ((!requestedByUser && mOperationStack.size() != 4) 
       || (requestedByUser && mOperationStack.size() != 3)) 
      return null; 

     String left = (String) mOperationStack.get(0); 
     String operator = (String) mOperationStack.get(1); 
     String right = (String) mOperationStack.get(2); 
     String tmp = null; 
     if (!requestedByUser) 
      tmp = (String) mOperationStack.get(3); 

     double leftVal = Double.parseDouble(left.toString()); 
     double rightVal = Double.parseDouble(right.toString()); 
     double result = Double.NaN; 

     if (operator.equals(KeypadButton.DIV.getText())) { 
      result = leftVal/rightVal; 
     } else if (operator.equals(KeypadButton.MULTIPLY.getText())) { 
      result = leftVal * rightVal; 

     } else if (operator.equals(KeypadButton.PLUS.getText())) { 
      result = leftVal + rightVal; 
     } else if (operator.equals(KeypadButton.MINUS.getText())) { 
      result = leftVal - rightVal; 

     } 

     String resultStr = doubleToString(result); 
     if (resultStr == null) 
      return null; 

     mOperationStack.clear(); 
     if (!requestedByUser) { 
      mOperationStack.add(resultStr); 
      mOperationStack.add(tmp); 
     } 

     return resultStr; 
    } 

    public String doubleToString(double value) { 
     if (Double.isNaN(value)) 
      return null; 

     long longVal = (long) value; 
     if (longVal == value) 
      return Long.toString(longVal); 
     else 
      return Double.toString(value); 

    } 

    public double tryParseUserInput() { 
     String inputStr = userInputText.getText().toString(); 
     double result = Double.NaN; 
     try { 
      result = Double.parseDouble(inputStr); 

     } catch (NumberFormatException nfe) {} 
     return result; 

    } 

    public void displayMemoryStat() { 
     if (Double.isNaN(memoryValue)) { 
      memoryStatText.setText(""); 
     } else { 
      memoryStatText.setText("M = " + doubleToString(memoryValue)); 
     } 
    } 
} 

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TextView 
     android:id="@+id/txtStack" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="15sp" 
     android:gravity="right" 
     android:layout_marginTop = "3sp" 
     android:layout_marginLeft = "5sp" 
     android:layout_marginRight = "5sp"/> 


    <TextView 
     android:id="@+id/txtInput" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="25sp" 
     android:gravity="right" 
     android:layout_marginLeft = "5sp" 
     android:layout_marginRight = "5sp"/> 


    <TextView 
     android:id="@+id/txtMemory" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="15sp" 
     android:gravity="left" 
     android:layout_marginLeft = "5sp" 
     android:layout_marginRight = "5sp"/> 

<GridView 
    android:id="@+id/grdButtons" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:columnWidth="90dp" 
    android:numColumns="5" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center"/> 
</LinearLayout> 

출력 :

image

,451,515,

스택 추적은 :

E/AndroidRuntime(1492): FATAL EXCEPTION: main 
E/AndroidRuntime(1492): Process: com.calculator, PID: 1492 
E/AndroidRuntime(1492): java.lang.NullPointerException 
E/AndroidRuntime(1492): at com.calculator.MainActivity.ProcessKeypadInput(MainActivity.java:132) 
E/AndroidRuntime(1492): at com.calculator.MainActivity$1.onClick(MainActivity.java:50) 
E/AndroidRuntime(1492): at android.view.View.performClick(View.java:4438) 
E/AndroidRuntime(1492): at android.view.View$PerformClick.run(View.java:18422) 
E/AndroidRuntime(1492): at android.os.Handler.handleCallback(Handler.java:733) 
E/AndroidRuntime(1492): at android.os.Handler.dispatchMessage(Handler.java:95) 
E/AndroidRuntime(1492): at android.os.Looper.loop(Looper.java:136) 
E/AndroidRuntime(1492): at android.app.ActivityThread.main(ActivityThread.java:5017) 
E/AndroidRuntime(1492): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(1492): at java.lang.reflect.Method.invoke(Method.java:515) 
E/AndroidRuntime(1492): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
E/AndroidRuntime(1492): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
E/AndroidRuntime(1492): at dalvik.system.NativeStart.main(Native Method) 
  • 나는 NullPointer 예외 오류를 해결하는 방법을 모르겠어요.
    + (플러스), 누르면서

  • 문제는 - (마이너스) * (MUL)/(DIV), MC, MR, C = (같음) 콤마 버튼 로그 캣 오류 occured.Other 0,1,2,3 ~ 9와 같은 버튼이 좋습니다.

  • 귀하의 답변을 환영합니다. 당신이 그렇게 할 때

  • 는에서 onCreate에서

+1

현실적으로 아무도 그 많은 코드를 읽지 않을 것입니다. 문제를 격리하십시오. 우리가 당신을 도울 수 있도록 도와주세요. – slezica

+0

예외가 발생한 줄을 알려주십시오. 59 번 줄 은요? – Szymon

+1

'userInputText''TextView'를 초기화하는 것을 잊어 버렸습니다 ... –

답변

4

감사하지 다른 레이아웃 구성 요소에 대한 userInputText

마찬가지로
userInputText= (TextView) findViewById(R.id.txtInput); 

에 대한 findViewById를 추가 할 필요, getText()

에 대한 또 다른 사람 식별 및 , 모든 구성 요소에 대해 코드에서 동일한 TextView를 사용하지 마십시오.

userInputText= (TextView) findViewById(R.id.txtInput); 
userInputText=(TextView)findViewById(R.id.txtStack); 
userInputText=(TextView)findViewById(R.id.txtMemory); 

올바르지 않습니다.

당신의 ProcessKeypadInput 방법에서 stackInputText 같은 스택 및 메모리 ....에 대한

를 사용하여 다른 텍스트 뷰, memoryInputText

+0

나는 그것을합니다. 이제 출력이 나옵니다. 그러나 + - (빼기), * (곱하기),/(나누기), MC, MR, C, = (같음) 및 쉼표 버튼을 누릅니다. –

+0

TextView를 txtInput, txtStack 및 txtMemory에 추가했습니다. 계산기 출력이 있습니다. 문제는 + (더하기), - (빼기), * (열),/(div), MC, MR, C = = 평등) 및 쉼표 단추 Logcat 오류가 발생했습니다. 0,1,2,3을 좋아하는 다른 단추는 괜찮습니다. –

+0

나는 코드를 편집하고 logcat을 게시한다 –

2

, 다음과 같은 코드가 있습니다

case MULTIPLY: 
     if (resetInput) { 
      mInputStack.pop(); 
      mOperationStack.pop(); 
     } else { 
      if (currentInput.charAt(0) == '-') {  // <-------- Problem line 
       mInputStack.add("(" + currentInput + ")"); 
      } else { 
       mInputStack.add(currentInput); 
      } 
      mOperationStack.add(currentInput); 
     } 

내가 표시된 선이 원인이 될 것으로 보인다 문제는 당신이 logcat에서보고 있습니다. currentInput의 첫 번째 문자를 평가하려고 시도했지만 아무 문자가 포함되어 있지 않은지 확인하십시오. currentInput. 문자가 전혀없는 문자열의 첫 번째 문자를 평가하려고하면 throw the exception you are seeing이됩니다.

하나 개의 솔루션은 다음과 같은 질문에 아래에 줄을 변경하는 것입니다 : 문자열이 하나 이상의 문자를 포함하지 않는 한 이것은 첫 번째 문자를 평가하는 시도를 방지 할 수

... 
    if (currentInputLen > 0) { 
     if (currentInput.charAt(0) == '-') { 
      mInputStack.add("(" + currentInput + ")"); 
     } else { 
      mInputStack.add(currentInput); 
     } 
     mOperationStack.add(currentInput); 
    } 
} 

, 또한 널 (null)을 방지 포인터 예외.

+0

이제 null 포인터 예외가 발생합니다. –

+0

null 포인터 예외에 대한 계정에 대한 내 대답이 편집되었습니다. – mike47

+1

130 번째 줄에 여전히 오류가 있습니다. –

관련 문제