我在使用switch case时,碰到这样的场景:
for (int i = 0; i < nodes.size(); i++) {
String chinese = nodes.get(i);
switch (PinYinUtil.getFirstSpell(chinese)) {
case "a":
aNodes.add(chinese);
break;
//......
default:
others.add(chinese);
break;
}
这里是根据字符串拼音首字母来实现相应分类,而在我处理拼音的内容里是这样的:
/**获取汉字串拼音首字母(第一个字母的首字母),英文字符不变
*
* **/
public static String getFirstSpell(String chinese) {
try {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
if(arr.length >0){
String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr[0], defaultFormat);
if (temp != null) {
pybf.append(temp[0].charAt(0));
}
}
return pybf.toString().replaceAll("\\W", "").trim();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
可以看到,在处理过程中,针对字符串的首字母——如果是汉字那么返回其相应的首拼音,否则返回null。
万恶之源就出在了这里,switch中的判断是不会将null归于拼音字母之外的default里,反而会给你报一个空指针异常!
所以应该将PinYinUtil里的非拼音返回限定为固定字符串内容,如:
public static String getFirstSpell(String chinese) {
/*内容不变*/
return "Other";
}
吃一堑长一智