我正在尝试创建一个计算器设计.但我没有得到任何编译时错误.最后在运行Project /代码时出现nullpointer异常发生错误.
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>
输出:
堆栈跟踪:
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,=(等于)和逗号按钮Logcat错误发生.其他按钮如0,1,2,3到9其罚款.
>欢迎您的回答.
>谢谢
解决方法
在onCreate中,需要为userInputText添加findViewById
userInputText= (TextView) findViewById(R.id.txtInput);
对于其他布局组件也是如此,否则getText()没有标识
当你这样做时,请不要在代码中为所有组件使用相同的TextView ……
userInputText= (TextView) findViewById(R.id.txtInput); userInputText=(TextView)findViewById(R.id.txtStack); userInputText=(TextView)findViewById(R.id.txtMemory);
是不正确的.
对堆栈和内存使用不同的TextView ….就像stackInputText,memoryInputText