2014-03-26 52 views
0

作品麻煩加上引號

public static void main(String[] args) throws Exception { 
    String PATH = "C:\\WINDOWS\\system32\\notepad.exe"; 
    new ProcessBuilder(PATH).start(); 
} 

不起作用

public static void main(String[] args) throws Exception { 
    String PATH = "‪C:\\WINDOWS\\system32\\notepad.exe"; 
    new ProcessBuilder(PATH).start(); 
} 

Exception in thread "main" java.io.IOException: Cannot run program "‪C:\WINDOWS\system32\notepad.exe": CreateProcess error=2, The system cannot find the file specified 

兩個片段似乎是相同的。在第一個示例中,我手動輸入了路徑周圍的引號。在後面的例子中,引號被複制並從網站粘貼。當我將兩個引號複製並粘貼到Unicode character lookup tool時,我都獲得了相同的結果。

爲什麼使用完全相同的Unicode字符替換Unicode字符突然修復我的代碼?我在這裏錯過了什麼嗎?

如果有人認爲片段相同,請打開您最喜歡的IDE並複製並粘貼上面的片段而不更改單個字符。我在Windows 8機器上使用NetBeans IDE 7.4。我也嘗試過Eclipse並獲得了相同的結果。

+0

看看第一個'.equals()''PATH在第二個'中是否有'PATH'。 – nimsson

+0

@BheshGurung聽起來更像Eclipse沒有被設置爲使用Unicode格式的源文件或字符在其位置上是意想不到的,而不是所涉及的字符是非Unicode。 – JAB

回答

2

我很驚訝這個編譯。第二段代碼在第一個引號前面(引號之外;因此是非法的Java語法)有一個左對齊嵌入字符(U + 202A)。 (這似乎被Bhesh Gurung的評論所證實。)

如果您以某種方式獲得了編譯代碼,那麼我懷疑您運行的代碼與您在此發佈的代碼有點不同:即U_202A結束了在引號內部;因此文件未找到的錯誤。

+0

OP如何獲得運行時異常很有趣。 –

+0

@BheshGurung - 是的。我認爲這裏發佈的OP不是OP運行的內容。 –

+0

我想你所說的任何話都是正確的,因爲那是我在Eclipse上發現的。可能是OP中缺少的東西。 –

1

您從網站複製和粘貼的代碼片段中有一些非打印字符混合到文件名中,因此它看起來與輸入的字符相同,但包含多餘的字符。正如您發現的那樣,這通常會導致路徑不正確。如果某些程序不會更改可見部分的表示(並且其他程序也會刪除前導/尾隨空白),那麼某些程序將剝離這些非打印字符,但是並非所有這些都會這樣做。

您可以通過將這兩個代碼片段粘貼到支持Unicode的文本編輯器中進行驗證,並比較長度/字節數(將它們保存爲文件並在文本編輯器不報告非打印字符時檢查文件大小) 。第二個片段的長度爲159,第一個片段的長度爲156。