2012-07-04 17 views
-1

我有下面的代碼無法正常工作。當我在調試器中執行相同的代碼示例時,它工作正常。出於某種原因,儘管foo總是等於bar,並且從未擁有"bin/"使用concat在java中

實際代碼:

private String execpath_; 

    public void setMambaPath(String executable) 
    { 

    if (!(executable.endsWith("/"))) 
     executable = executable.concat("/"); 

    execpath_ = executable + "bin/"; 
    } 

別處其中execpath_ =只是excutable沒有斌/:

StringBuilder cmd = getSshCommand_(); 
cmd.append(execpath_ + "mambaService"); 

我不使用execpath_其他地方

+1

調用'setFoo' _will_設置foo且斌/級聯吧。代碼或環境的其他部分有問題。由於你沒有發佈,所以沒有人能告訴你這是什麼。 – Gene

+0

我已經更新了我正在使用的實際代碼。 – Grammin

+1

代碼還不夠。當你告訴我們哪裏有你不想要的值的「Log'跟蹤消息時,我們就會開始工作。 – Gene

回答

2

String是不可變的變量,不包含更改String對象本身內容的方法。所以你需要使用concat()方法。

或第二方法,您可以使用StringBuilder

private String foo; 

public void setFoo(String bar) 
{ 
    StringBuilder builder = new StringBuilder(); 
    builder.append(bar + "bin/"); 
    foo = builder.toString(); 
} 
+0

他不能在原地更改字符串,但他肯定可以將字符串替換爲他的變量引用(這是他正在做的)。並且+似乎是一個很好的運算符......「Java語言爲字符串連接運算符(+)提供了特別的支持」。 – hatchet

+0

execpath_ = executable.concat(「bin /」);不改變它也。我很困惑,我在調試器中逐字逐句地通過它,它沒有任何意義 – Grammin

+0

我更新答案檢查它。 – Sajmon

0

郵政更多的代碼(包括其中稍後使用foo)。 foo要麼在別的地方被修改,要麼setFoo有一個本地foo,它被修改而不是this.foo。我很確定這是第一個。

+0

這是所有的代碼,我可以在foo調用後在調試器中查看它,但它沒有改變。 – Grammin

+0

我已經更新了即時通訊使用的實際代碼。 – Grammin

0

什麼工作:

public void setMambaPath(String executable) 
    { 

    if (!(executable.endsWith("/"))) 
     executable = executable.concat("/"); 

    executable = executable.concat("bin/"); 

    execpath_ = executable; 
    } 
+0

所以至少有兩個不必要的臨時字符串。 StringBuilder方法顯着更高效。如果execpath_字段一旦設置就應該不變,它也不會讓我感到驚訝。不可變的對象是好的。 –

+1

當原文沒有時,它仍然沒有任何意義。它只能是1)其他事情發生了變化(因爲存在一個自身解決的構建問題),2)編譯器錯誤或其他問題3)一個線程是作者,另一個是讀者,所以必須聲明該成員是volatile的以確保不會創建線程本地副本。如果是線程本地問題,那麼僅僅因爲調用concat()會阻止優化器就會消失。不是一個可靠的解決方這就是我不斷要求更多代碼的原因。仍然不足以解決這個問題。 – Gene

+0

@Gene - 我必須同意。我認爲'修復'是一個副作用。根本原因可能仍然存在,只是不太可能發生(但仍可能發生)。症狀符合正在進行的線程問題。 – hatchet