0

Android dev で最初から学習するために電卓をプログラムしようとしていますが、人間が理解できない問題に直面しています。あなたが人間でないことを願っています。

私のIf条件を見てください:

    if (result != "")
    {
        textView.append("0");

    }

(isEmpty() は API7 でサポートされていないため、isEmpty() メソッドの代わりに « result != "" » を使用したことに気付くかもしれません)。

良い。次に、2 つの「結果」変数を見てください。

result  "" (id=830012674816)    
count   0   
hashCode    0   
offset  0   
value    (id=830012674848)  

result  "" (id=830022154000)    
count   0   
hashCode    0   
offset  0   
value    (id=830022154032)  

(Eclipse Debugger から 2 つの結果をコピーしました)

最初の結果は OK です。これは、プログラムを開始したときに得られるものです。if はその仕事を行い、通過します。2 つ目はまったく同じように見えますが、理由は不明ですが、if の内部に入り、ゼロを追加します。「プラス」ボタンを押すと、この問題が発生します。

何か案が ?

情報が不足している、または問題を理解していない場合は、ここでワークスペース全体 (進行中) を見つけることができます: http://www.sendspace.com/file/udp5d3。問題を再現するには、プログラムの起動時に「ゼロ」ボタンを押します。通常は表示されないことに注意してください。次に、「104」、「7」、「73」などの任意の数字を入力し、「プラス」ボタンを押してから「ゼロ」を押します。ゼロはここに表示されるべきではありません。

ありがとうございました :)

4

7 に答える 7

5

文字列 (または任意のオブジェクト) を で比較しないでください!=。またはequals()のように使用する!("".equals(result))!(result.equals(""))

==オブジェクトに同じ値が含まれているかどうかではなく、参照に同じオブジェクトが含まれているかどうかを確認するために使用されます。

例えば

Integer i1=new Integer(1);
Integer i2=new Integer(1);
Integer i3=i1;
//checking references
System.out.println(i1==i2);//false
System.out.println(i1==i3);//true

//checking values
System.out.println(i1.equals(i2));//true
System.out.println(i1.equals(i3));//true
于 2012-07-16T12:11:18.397 に答える
1

変化する:

if (result != "")

に:

if (!result.equals(""))

または、より好ましくは、TextUtilswhich もチェックを使用しnullます。

if(!TextUtils.isEmpty(result))
于 2012-07-16T12:12:12.330 に答える
0

if句の式は、変数の値ではなく参照resultがオブジェクトと等しくないかどうかをチェックします""。そのため、常にtrueになります。result != ""使用する代わりに!result.equals("")

于 2012-07-16T12:13:29.503 に答える
0

このメソッドを呼び出す必要があります!result.equals("")

result == " "文字列オブジェクトの内容ではなく、オブジェクトインスタンスを比較します。

于 2012-07-16T12:13:49.563 に答える
0

他の回答が言ったようString.equals()に、.Stringsequals==

ただし、質問で指摘したよう==に、アプリケーションが初めて比較を実行したときに true と評価された 2 つの文字列を使用しています。これはString interningが原因で発生しました。resultほとんどの場合、変数の初期化中に、後で比較したのと同じ値の定数に を代入しました - "". 次に、JVM はインターンを使用しStringて特定の値の定数のインスタンスを 1 つだけ保持するため、result変数に含まれる参照は実際には比較の定数への参照と同じであり、等価テストは true と評価されます。

==そのため、文字列の比較に使用するのが適切な (かなり特殊な) ケースがあります。この質問を参照してください。リストとさらなる議論の最良の答えです。

于 2012-07-16T12:56:24.367 に答える
0

contentEquals代わりに使用してみてください。例えば

if (!result.contentEquals(""))

http://developer.android.com/reference/java/lang/String.html#contentEquals(java.lang.CharSequence )

その理由は、Java では==、2 つのオブジェクト参照が同じインスタンスを指している場合に true を返しますが、2 つの文字列を比較して、同じ文字が同じ順序で含まれているかどうかを確認する必要があるためです。これは同じことではありません。

于 2012-07-16T12:10:28.690 に答える
0

1.オブジェクトは Java で比較さ.equals()れ、文字列は Java のオブジェクトです。

2.したがって、文字列は同じ規則に従う必要があります。

例:

 if (!(result.equals("")))
    {
        textView.append("0");

    }
于 2012-07-16T12:24:02.830 に答える