diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
index 2dbb5eb9354d3807744d0372fccea05cb54b929a..9a24c47afa84fe897aad9be2e799fbdcf20339fc 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictDecoderUtils.java
@@ -643,6 +643,10 @@ public final class BinaryDictDecoderUtils {
      * @return true if it's a binary dictionary, false otherwise
      */
     public static boolean isBinaryDictionary(final File file) {
-        return FormatSpec.getDictDecoder(file).hasValidRawBinaryDictionary();
+        final DictDecoder dictDecoder = FormatSpec.getDictDecoder(file);
+        if (dictDecoder == null) {
+            return false;
+        }
+        return dictDecoder.hasValidRawBinaryDictionary();
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java b/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
index 07ba777c7650ae810dfa66395c50d654f82f9fc9..0dc50d14e053c0f3982347993ca5ea29daa00c2a 100644
--- a/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
+++ b/java/src/com/android/inputmethod/latin/makedict/BinaryDictIOUtils.java
@@ -309,6 +309,7 @@ public final class BinaryDictIOUtils {
      * @param file The file to read.
      * @param offset The offset in the file where to start reading the data.
      * @param length The length of the data file.
+     * @return the header of the specified dictionary file.
      */
     private static FileHeader getDictionaryFileHeader(
             final File file, final long offset, final long length)
@@ -330,6 +331,9 @@ public final class BinaryDictIOUtils {
                     }
                 }
         );
+        if (dictDecoder == null) {
+            return null;
+        }
         return dictDecoder.readHeader();
     }
 
diff --git a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
index 021bf08255b69a77d28f586b6d515252090f9b17..3daa63ff4fc17ad6065bb45bab897a8a3cb0a1e2 100644
--- a/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/DictionaryInfoUtils.java
@@ -282,10 +282,19 @@ public class DictionaryInfoUtils {
         return BinaryDictIOUtils.getDictionaryFileHeaderOrNull(file, 0, file.length());
     }
 
+    /**
+     * Returns information of the dictionary.
+     *
+     * @param fileAddress the asset dictionary file address.
+     * @return information of the specified dictionary.
+     */
     private static DictionaryInfo createDictionaryInfoFromFileAddress(
             final AssetFileAddress fileAddress) {
         final FileHeader header = BinaryDictIOUtils.getDictionaryFileHeaderOrNull(
                 new File(fileAddress.mFilename), fileAddress.mOffset, fileAddress.mLength);
+        if (header == null) {
+            return null;
+        }
         final String id = header.getId();
         final Locale locale = LocaleUtils.constructLocaleFromString(header.getLocaleString());
         final String description = header.getDescription();
@@ -328,7 +337,7 @@ public class DictionaryInfoUtils {
                     // Protect against cases of a less-specific dictionary being found, like an
                     // en dictionary being used for an en_US locale. In this case, the en dictionary
                     // should be used for en_US but discounted for listing purposes.
-                    if (!dictionaryInfo.mLocale.equals(locale)) continue;
+                    if (dictionaryInfo == null || !dictionaryInfo.mLocale.equals(locale)) continue;
                     addOrUpdateDictInfo(dictList, dictionaryInfo);
                 }
             }