電卓用のコードをいくつか用意しています(これまでの作業は覚えていますが)。Android - 動作しなければならないコードのエラー
私はarrayList.get()
をすべてチェックして、正しいインデックスを指していることを確認しました。ループあたりの正確な数はarrayList.remove()
です。
私が考えることができる唯一の他のものは、結果が小数であるかどうかをチェックするループ(おそらく、メソッドの最下部に近いところ)が物事を乱しているということです。ここで
はコードです:
public void onClickEquals (View view) {
TextView textViewError = (TextView) findViewById(R.id.textViewCalcPrevRes);
TextView textViewCalcPrevRes = (TextView) findViewById(R.id.textViewCalcPrevRes);
TextView textViewCalcCurrExp = (TextView) findViewById(R.id.textViewCalcCurrExp);
TextView textViewCalcPrevExp = (TextView) findViewById(R.id.textViewCalcPrevExp);
double calc = 0;
String calcOutputStr = "";
String tempString = "";
int c = arrayList.size();
try {
textViewError.setText("");
//i.e. array [2,+,3,*,4,-,3] size(c) = 7, so [2,+,3,*,4,-,3]
while (c != 1) {
if (c > 3) {
if (arrayList.get(3).contains("×") || arrayList.get(3).contains("÷")) {
if (arrayList.get(3).contains("×")) {calc = Double.parseDouble(arrayList.get(2)) * Double.parseDouble(arrayList.get(4));}
if (arrayList.get(3).contains("÷")) {calc = Double.parseDouble(arrayList.get(2))/Double.parseDouble(arrayList.get(4));}
//calc = 12 ;array = [2,+,3,*,4,-,3]
arrayList.remove(2); //[2,+,*,4,-,3]
arrayList.remove(2); //[2,+,4,-,3]
arrayList.remove(2); //[2,+,-,3]
arrayList.add(2, Double.toString(calc)); //[2,+,12,-,3]
c = arrayList.size(); // size(c) = 5
} else {
//[2,+,12,-,3]
if (arrayList.get(1).contains("+")) {calc = Double.parseDouble(arrayList.get(0)) + Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("-")) {calc = Double.parseDouble(arrayList.get(0)) - Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("×")) {calc = Double.parseDouble(arrayList.get(0)) * Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("÷")) {calc = Double.parseDouble(arrayList.get(0))/Double.parseDouble(arrayList.get(2));}
//calc = 14
arrayList.remove(0); //[+,12,-,3]
arrayList.remove(0); //[12,-,3]
arrayList.remove(0); //[-,3]
arrayList.add(0, Double.toString(calc)); //[14,-,3]
c = arrayList.size(); // size(c) = 3
}
}
// size(c) <= 3
else {
if (arrayList.get(1).contains("+")) {calc = Double.parseDouble(arrayList.get(0)) + Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("-")) {calc = Double.parseDouble(arrayList.get(0)) - Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("×")) {calc = Double.parseDouble(arrayList.get(0)) * Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("÷")) {calc = Double.parseDouble(arrayList.get(0))/Double.parseDouble(arrayList.get(2));}
//calc = 11
arrayList.remove(0); //[-,3]
arrayList.remove(0); //[3]
arrayList.remove(0); //[null]
arrayList.add(0, Double.toString(calc)); // [9]
c = arrayList.size(); // size(c) = 1
prevCalc = Double.toString(calc);
}
//CHECK IF DECIMAL - SHOULD BE OUTSIDE WHILE LOOP
//check if calc is a whole number; if yes, convert to string and enter into tempString, remove decimal and enter into calcOutputStr ready for display on screen.
if (calc % 1 == 0) {
tempString = Double.toString(calc);
if (tempString != null) {
tempString = tempString.substring(0, tempString.length() - 2);
}
calcOutputStr = tempString;
arrayList.clear();
}
//if calc is a decimal convert to string ready for display on screen.
else {
calcOutputStr = Double.toString(calc);
arrayList.clear();
}
}
textViewCalcPrevExp.setText(textViewCalcCurrExp.getText()); //copy text from textViewCalcCurrExp to textViewCalcPrevExp
textViewCalcCurrExp.setText(""); //remove text from textViewCalcCurrExp
textViewCalcPrevRes.setText(calcOutputStr); //display calc
stringInput = "";
stringInputWithOp="";
}
catch (Exception e) {
e.printStackTrace();
textViewCalcPrevExp.setText(textViewCalcCurrExp.getText());
textViewCalcCurrExp.setText("");
stringInput="";
stringInputWithOp="";
arrayList.clear();
textViewError.setText("ERROR");
}
}
私は私の問題を説明するのに役立つ2つのシナリオあげる:、この方法を実行している時にtextViewCalcPrevRes
ディスプレイ4
arrayList = [2,+,2,+,2];
を
arrayList = [2,+,2];
をこの方法を実行すると、textViewCalcPrevRes
が表示されますERROR
、例外をスローし、スタックトレースをコンソールに出力するメソッドがあるためです(次のコードブロックを参照)。本当に奇妙なことは、catch{}
ステートメントがをtextViewError
に出力し、textViewCalcPrevRes
でないことです。
はここで、シナリオ2のコンソールに出力されたスタックトレースです:
W/System.err: java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
W/System.err: at java.util.ArrayList.get(ArrayList.java:411)
W/System.err: at com.st1.u3141294.sparkscientificcalculator.sparkMain$override.onClickEquals(sparkMain.java:126)
W/System.err: at com.st1.u3141294.sparkscientificcalculator.sparkMain$override.access$dispatch(sparkMain.java)
W/System.err: at com.st1.u3141294.sparkscientificcalculator.sparkMain.onClickEquals(sparkMain.java:0)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
W/System.err: at android.view.View.performClick(View.java:5610)
W/System.err: at android.view.View$PerformClick.run(View.java:22260)
W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:154)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6077)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
明らかにそれがIndexOutOfBounds例外を投げ、しかし、私は実際にどのように/なぜわかりません。
どのようなアイデアをお願いしますか?
EDIT:さらに "調査" の例外の起源は(//-->
印)のコード行からであることを示唆している:
// size(c) <= 3
else {
//-->if (arrayList.get(1).contains("+")) {calc = Double.parseDouble(arrayList.get(0)) + Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("-")) {calc = Double.parseDouble(arrayList.get(0)) - Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("×")) {calc = Double.parseDouble(arrayList.get(0)) * Double.parseDouble(arrayList.get(2));}
if (arrayList.get(1).contains("÷")) {calc = Double.parseDouble(arrayList.get(0))/Double.parseDouble(arrayList.get(2));}
EDIT:コード-見習い@:
シナリオ2をarrayList
(つまり[2,+,2,+,2]
)の内容として使用すると、私のコードがうまくいくはずです。コード実行の最初のブロックはc = arrayList.size() = 5
ので
、それはelse
ループに行くので、何の乗算/除算演算子は、arrayList
ではありません:トレース以下のc = arrayList.size() = 3
以来、
while (c != 1) {
if (c > 3) {
//here is code only run if there are multiplication or division operators in arrayList
} else {
if (arrayList.get(1).contains("+")) {calc = Double.parseDouble(arrayList.get(0)) + Double.parseDouble(arrayList.get(2));}
}
arrayList.remove(0); //bringing arrayList down to [+,2,+,2]
arrayList.remove(0); //then [2,+,2]
arrayList.remove(0); //then [+,2]
arrayList.add(0, Double.toString(calc)); //then adding 4 (calc) to arrayList[0] would give [4,+,2]
c = arrayList.size(); // therefore arrayList.size() = 3
}
:
。 – RThomP
"Index:1、Size:0"これはリストが空であることを意味します。デバッグを使用して、これがなぜそうであるかを理解する必要があります。 –
さらに助けが必要な場合は、クラッシュの原因となった行を教えてください。 –