2012-10-19 55 views
0

我有一個FilenameFilter過濾除了MIME類型文本和所有子類型的目錄和文件(或者應該以任何方式),但是當我使用。 matches()函數會拋出一個NullPointerException異常。當我研究它時,當正則表達式語法不正確時,.matches()函數會拋出NullPointerException異常。.matches(「text /.*」)throwing NullPointerException

FilenameFilter filter = new FilenameFilter() 
{ 
    public boolean accept(File dir, String name) 
    { 
     File tmp = new File(dir.getAbsolutePath() + "/" + name); 
     if (tmp.isDirectory()) 
     { 
      return true; 
     } 
     else 
     { 
      String type = null; 
      String extension = MimeTypeMap.getFileExtensionFromUrl(dir.getAbsolutePath() + "/" + name); 
      if (extension != null) 
      { 
       MimeTypeMap mime = MimeTypeMap.getSingleton(); 
       type = mime.getMimeTypeFromExtension(extension); 
      } 
      return type.matches("text/.*"); 
     } 
    } 
}; 

有一個文件被傳遞,沒有MIME,因此它輸出爲空。這裏是修復:

FilenameFilter filter = new FilenameFilter() 
{ 
    public boolean accept(File dir, String name) 
    { 
     File tmp = new File(dir.getAbsolutePath() + "/" + name); 
     if (tmp.isDirectory()) 
     { 
      return true; 
     } 
     else 
     { 
      String type = ""; 
      String extension = MimeTypeMap.getFileExtensionFromUrl(dir.getAbsolutePath() + "/" + name); 
      if (extension != null) 
      { 
       MimeTypeMap mime = MimeTypeMap.getSingleton(); 
       type = mime.getMimeTypeFromExtension(extension); 
       if (type != null) 
       { 
        return type.matches("text/.*"); 
       } 
       else 
       { 
        return false; 
       } 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
}; 

這裏從蝕的描述: 字符串android.webkit.MimeTypeMap.getMimeTypeFromExtension(字符串擴展)

公共字符串getMimeTypeFromExtension(字符串擴展) 自:API級別1 返回給定擴展的MIME類型。

參數 擴展名沒有前導'。'的文件擴展名。

返回 給定擴展名的MIME類型,如果沒有,則返回null。

+0

我願意打賭_type_爲null。通過添加調試語句很容易確定:_System.out.println(「type:」+ type); _ – jahroy

回答

2

你的字符串變量type可能null如果它不if語句進入該:

if (extension != null) 
    { 
    MimeTypeMap mime = MimeTypeMap.getSingleton(); 
    type = mime.getMimeTypeFromExtension(extension) 
    } 

因此,這極有可能是你NullPointerException

+0

它會返回false,不是嗎?這就像是說: – Timberwolf

+0

如果你沒有專門測試名爲_type_的變量是否爲空,請做。 99.999%這樣的問題只是空字符串....你的if語句檢查_extension_,然後你在另一個變量(名爲_type_)上調用_matches_。名爲_type_的變量幾乎肯定是null。 – jahroy

+0

String a =「」;返回a.matches(「呃」); – Timberwolf

0

變量類型爲空。

添加一行代碼,你可以看到自己這一點:

System.out.println("type: " + type); 

的輸出將是零。

你的代碼中有一處與你的正則表達式無關的問題。

+0

這不適用於Android。 – Timberwolf

+0

@TimberwolfProgrammers - 我確定在某個地方有一個控制檯...並且您當然可以使用Eclipse調試您的應用程序。我還沒有用Eclipse或Android做太多的工作,但我非常肯定這就是LogCat的全部目的。我認爲你遇到的主要問題是你需要學習如何調試你的代碼。 – jahroy