2012-01-04 165 views
4

我是新來的Java,我研究字符串,我想要一個字符串顛倒。這裏是我的代碼意外的類型錯誤

String myStr = "abcdef"; String reversed = ""; 
for(int j=myStr.length()-1;j>=0;j--) { 
    myStr.charAt(j) += reversed; 
} 

但它給我一個錯誤信息:

****.java:14: error: unexpected type 
required: variable 
found: value 

但是當我通過System.out.print(reversed)打印出來,它打印正確reversed。變量和值有什麼區別?儘管給我一個錯誤信息,爲什麼它能給我正確的答案?我會感謝您的回答,謝謝

+0

錯誤在哪裏? – 2012-01-04 22:34:41

+1

如果它首先不能編譯,它如何打印? – 2012-01-04 22:36:57

+0

它給我和錯誤消息在構建輸出像意想不到的類型 – El3ctr0n1c4 2012-01-04 22:38:51

回答

4

的問題是在這裏:

myStr.charAt(j) += reversed; 

的左手側是一個值。不是一個變量。這就是爲什麼你不能到+=


雖然這違背了學習如何做硬盤的方式的目的,你可以做這樣的:

myStr = new StringBuffer(myStr).reverse().toString(); 
+0

哈哈,謝謝:)) – El3ctr0n1c4 2012-01-04 22:39:41

0

+=對一個變量不起作用。 myStr.charAt(j)會返回一個值,並且您不能在該值上使用+=。它必須是一些變量,如reversed。 例如

reversed += myStr.substring(j, j+1); 
+0

我只是解釋了錯誤信息。這就像做'5 + = 1;'而不是'int a = 5; a + = 1;'。但是,我也爲解決真正的問題添加了解決方案。 – 2012-01-04 22:43:59

+0

很好的答案,謝謝.. – El3ctr0n1c4 2012-01-04 22:45:57

+1

不客氣。 – 2012-01-04 22:46:47

2

它是前人的精力...... reversed += new String(myStr.charAt(j));意想不到的類型是什麼樣的charAt( j)的返回

+0

謝謝,我剛剛犯了一個小錯誤 – El3ctr0n1c4 2012-01-04 22:40:55

+0

哦...是的...在循環內使用'... + = new String(...)'是非常糟糕的主意。 ..使用StringBuilder來代替它的方法.append(char)。 – A4L 2012-01-04 22:44:38

1
String myStr = "abcdef"; 
String reversed = ""; 

for(int j = myStr.length()-1 ; j >= 0; j--) 
{ 
    reversed += myStr.CharAt(j); 
} 
+0

感謝您的回答:) – El3ctr0n1c4 2012-01-04 22:47:35

+1

不客氣(總是)。 – Lion 2012-01-04 22:56:48

0

你需要的是reversed += myStr.charAt(j)。你只能給一個變量賦值。 myStr.charAt(j)不是一個變量。它是一個返回值或類型char的表達式。

您還應該使用StringBuilder並將每個字符追加到StringBuilder中,因爲您的循環在每次迭代時都會創建一個新的String實例,這實際上效率不高。

+0

對我有好處,謝謝! – El3ctr0n1c4 2012-01-04 22:43:48

0

變量是您可以存儲值的地方。他們必須申報,並在使用前分配一個值:

String reversed = ""; 

reversed是分配價值""的變量。 只有變量可能位於作業的左側(如=)。 +=是一種特殊類型的分配。 a += b;基本上與a = a + b;相同。

值是表達式的結果。表達式類似於變量引用(reversed),常量(""),方法調用(myStr.charAt(0))和操作(a + b)。值可以位於作業的右側。

我不確定它爲什麼給你正確的答案,因爲當你有這樣的編譯錯誤時,代碼不應該運行。

+0

是的,它給了我一個正確的字符串,但我也對這個錯誤感到困惑,是否像編譯器的自動更正那樣? – El3ctr0n1c4 2012-01-04 22:55:50

+1

現在我想到了,可能是因爲編譯錯誤阻止了新的.class文件的輸出,所以.class文件從未被覆蓋。如果你之前有一個正確的工作版本,它可能會運行該版本。嘗試改變輸入myStr,看看它是否輸出新的正確答案。 – ILMTitan 2012-01-04 23:05:03

+0

哇,我剛剛改變了輸入並重新構建。是的,它沒有運行。非常感謝.. – El3ctr0n1c4 2012-01-04 23:08:25