diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index bdf8945..6e0bd1b 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -22,7 +22,6 @@
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
-import com.android.inputmethod.latin.makedict.Word;
 import com.android.inputmethod.latin.settings.NativeSuggestOptions;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 import com.android.inputmethod.latin.utils.JniUtils;
@@ -352,12 +351,7 @@
     public GetNextWordPropertyResult getNextWordProperty(final int token) {
         final int[] codePoints = new int[MAX_WORD_LENGTH];
         final int nextToken = getNextWordNative(mNativeDict, token, codePoints);
-        int len = 0;
-        // codePoints is null-terminated if its length is shorter than the array length.
-        while (len < MAX_WORD_LENGTH && codePoints[len] != 0) {
-            ++len;
-        }
-        final String word = new String(codePoints, 0, len);
+        final String word = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints);
         return new GetNextWordPropertyResult(getWordProperty(word), nextToken);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/utils/StringUtils.java b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
index c632a71..e7932b5 100644
--- a/java/src/com/android/inputmethod/latin/utils/StringUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
@@ -46,7 +46,7 @@
 
     public static String newSingleCodePointString(int codePoint) {
         if (Character.charCount(codePoint) == 1) {
-            // Optimization: avoid creating an temporary array for characters that are
+            // Optimization: avoid creating a temporary array for characters that are
             // represented by a single char value
             return String.valueOf((char) codePoint);
         }
@@ -205,6 +205,24 @@
         return codePoints;
     }
 
+    /**
+     * Construct a String from a code point array
+     *
+     * @param codePoints a code point array that is null terminated when its logical length is
+     * shorter than the array length.
+     * @return a string constructed from the code point array.
+     */
+    public static String getStringFromNullTerminatedCodePointArray(final int[] codePoints) {
+        int stringLength = codePoints.length;
+        for (int i = 0; i < codePoints.length; i++) {
+            if (codePoints[i] == 0) {
+                stringLength = i;
+                break;
+            }
+        }
+        return new String(codePoints, 0 /* offset */, stringLength);
+    }
+
     // This method assumes the text is not null. For the empty string, it returns CAPITALIZE_NONE.
     public static int getCapitalizationType(final String text) {
         // If the first char is not uppercase, then the word is either all lower case or
diff --git a/java/src/com/android/inputmethod/latin/utils/WordProperty.java b/java/src/com/android/inputmethod/latin/utils/WordProperty.java
index fed5d33..c6630eb 100644
--- a/java/src/com/android/inputmethod/latin/utils/WordProperty.java
+++ b/java/src/com/android/inputmethod/latin/utils/WordProperty.java
@@ -61,15 +61,6 @@
         }
     }
 
-    private static int getCodePointCount(final int[] codePoints) {
-        for (int i = 0; i < codePoints.length; i++) {
-            if (codePoints[i] == 0) {
-                return i;
-            }
-        }
-        return codePoints.length;
-    }
-
     // This represents invalid word when the probability is BinaryDictionary.NOT_A_PROBABILITY.
     public WordProperty(final int[] codePoints, final boolean isNotAWord,
             final boolean isBlacklisted, final boolean hasBigram,
@@ -77,7 +68,7 @@
             final ArrayList<int[]> bigramTargets, final ArrayList<int[]> bigramProbabilityInfo,
             final ArrayList<int[]> shortcutTargets,
             final ArrayList<Integer> shortcutProbabilities) {
-        mCodePoints = new String(codePoints, 0 /* offset */, getCodePointCount(codePoints));
+        mCodePoints = StringUtils.getStringFromNullTerminatedCodePointArray(codePoints);
         mIsNotAWord = isNotAWord;
         mIsBlacklisted = isBlacklisted;
         mHasBigrams = hasBigram;
@@ -86,9 +77,8 @@
 
         final int bigramTargetCount = bigramTargets.size();
         for (int i = 0; i < bigramTargetCount; i++) {
-            final int[] bigramTargetCodePointArray = bigramTargets.get(i);
-            final String bigramTargetString = new String(bigramTargetCodePointArray,
-                    0 /* offset */, getCodePointCount(bigramTargetCodePointArray));
+            final String bigramTargetString =
+                    StringUtils.getStringFromNullTerminatedCodePointArray(bigramTargets.get(i));
             final ProbabilityInfo bigramProbability =
                     new ProbabilityInfo(bigramProbabilityInfo.get(i));
             mBigramTargets.add(
@@ -98,9 +88,8 @@
 
         final int shortcutTargetCount = shortcutTargets.size();
         for (int i = 0; i < shortcutTargetCount; i++) {
-            final int[] shortcutTargetCodePointArray = shortcutTargets.get(i);
-            final String shortcutTargetString = new String(shortcutTargetCodePointArray,
-                    0 /* offset */, getCodePointCount(shortcutTargetCodePointArray));
+            final String shortcutTargetString =
+                    StringUtils.getStringFromNullTerminatedCodePointArray(shortcutTargets.get(i));
             mShortcutTargets.add(
                     new WeightedString(shortcutTargetString, shortcutProbabilities.get(i)));
         }
