replace File.separator出現異常:【java.lang.IllegalArgumentException: character to be escaped is missing】


寫代碼時,要寫這么一個功能:

將包名中的"."換成路徑分隔符("/"或"",視操作系統而定),要求在window或linux下都能正常運行。

分析一下,這明顯是個字符串替換的操作,可用使用String提供的replace方法;換成操作系統指定的路徑分隔符,可以使用File.separator來完成,代碼如下:

import java.io.File;
 
public class Test {
    public static void main(String[] args){
        String packageName = "com.xxx.model";
        String path = packageName.replaceAll("\\.", File.separator);
        System.out.println(path);
    }
}

但運行后,會報錯:

Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing
	at java.util.regex.Matcher.appendReplacement(Matcher.java:809)
	at java.util.regex.Matcher.replaceAll(Matcher.java:955)
	at java.lang.String.replaceAll(String.java:2223)
	at com.gop.yy.api.web.Test.main(Test.java:13)

原因在於,windows下File.separator為"",處理時會被當作轉義字符,后面看這個字符后一位,如果沒有任何內容,就報標題中的異常了。

正確寫法如下:

String path = packageName.replaceAll("\\.", Matcher.quoteReplacement(File.separator));

總結:

以上代碼雖然簡單,但有幾個陷阱在里面:

  1. 要用replaceAll()方法,而不是replace();
  2. 包名中的"."在正則中匹配時,要轉義\\..在正則表達式中匹配任意一個字符;
  3. windows下File.separator\,需要Matcher.quoteReplacement(File.separator)獲取。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM