Java .matches(“";text/*”)引发NullPointerException

Java .matches(“";text/*”)引发NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我有一个FilenameFilter,它可以过滤除目录和具有mime类型文本和所有子类型的文件之外的所有内容(或者应该是任何方式…),但是当我使用.matches()函数时,它会抛出一个NullPointerException。当我查看时,.matches()函数在正则表达式语法不正确时抛出一个NullPointerException FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir

我有一个FilenameFilter,它可以过滤除目录和具有mime类型文本和所有子类型的文件之外的所有内容(或者应该是任何方式…),但是当我使用.matches()函数时,它会抛出一个NullPointerException。当我查看时,.matches()函数在正则表达式语法不正确时抛出一个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,因此其输出为null。以下是修复方法:

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;
            }
        }
    }
};
以下是eclipse的描述: 字符串android.webkit.MimeTypeMap.getMimeTypeFromExtension(字符串扩展名)

公共字符串getMimeTypeFromExtension(字符串扩展名) 自:API级别1 返回给定扩展名的MIME类型

参数 扩展名不带前导“.”的文件扩展名

返回
给定扩展名或null的MIME类型(如果没有)

如果字符串变量
type
未输入此if语句,则它可能是
null

  if (extension != null)
  {
     MimeTypeMap mime = MimeTypeMap.getSingleton();
     type = mime.getMimeTypeFromExtension(extension)
  }
因此,很可能会得到名为type的变量为null

添加一行代码,您可以自己看到:

System.out.println("type: " + type);
输出将为空


代码中的其他地方存在与正则表达式无关的问题。

我敢打赌该类型为null。通过添加调试语句很容易确定:System.out.println(“type:+type”);它会返回false,不是吗?这就像是说:如果您没有专门测试名为type的变量是否为null,请这样做。99.999%的问题都是空字符串。。。。if语句检查扩展名,然后调用不同变量(命名类型)的匹配项。名为type的变量几乎肯定为null。@TimberwolfProgrammers您试图调用null对象上的方法。它抛出异常。那么它怎么会返回false呢?你认为程序的流程是错误的。如果出现异常,除非finally子句中有return语句,否则无法从方法返回值。@TimberwolfProgrammers代码中的正则表达式没有问题。我们讨论的是Java中的空引用。您知道如果对空引用调用方法会发生什么吗?搜索它,你就可以完成了,好吗?@TimberwolfProgrammers-所以。。。换句话说:名为type的变量为null。@TimberwolfProgrammers-我确信某个地方有一个控制台。。。你当然可以用Eclipse调试你的应用程序。我没有在Eclipse或Android上做过太多的工作,但我很确定这就是LogCat的全部目的。我认为您遇到的主要问题是您需要学习如何调试代码。