System.out.printf输出出现null值的原因分析及解决方法
问题分析与解决办法
为啥会出现null?
兄弟,这问题其实很好揪出根源:你用来存储星号的变量(不管是数组元素还是单独的字符串变量)没初始化为空字符串!Java里引用类型的默认值是null,当你直接把null和*做字符串拼接时,Java会自动把null转换成字符串"null",然后再拼接,就出现了你看到的null*、null***这种奇怪输出。
举个直白的例子,假设你代码里是这么写的:
String[] starArr = new String[5]; // 对应A、E、I、O、U,默认每个元素都是null // 统计到A时执行拼接 starArr[0] += "*";
第一次执行这个操作时,starArr[0]是null,实际执行的是null + "*",结果自然变成了"null*"——这就是你输出里null的由来!
怎么解决?
只需要把存储星号的变量提前初始化为空字符串就行,给你两种常用的实现方案:
方案1:初始化数组时给每个元素赋值为空字符串
public void printStars(String inputString) { // 初始化对应A、E、I、O、U的星号字符串,初始为空 String[] stars = {"", "", "", "", ""}; int countA = 0, countE = 0, countI = 0, countO = 0, countU = 0; for (char c : inputString.toCharArray()) { switch (c) { case 'a': countA++; stars[0] += "*"; break; case 'e': countE++; stars[1] += "*"; break; case 'i': countI++; stars[2] += "*"; break; case 'o': countO++; stars[3] += "*"; break; case 'u': countU++; stars[4] += "*"; break; default: break; } } // 输出时就不会有null了 System.out.println("Sentence: " + inputString); System.out.printf("%d A's %s%n", countA, stars[0]); System.out.printf("%d E's %s%n", countE, stars[1]); System.out.printf("%d I's %s%n", countI, stars[2]); System.out.printf("%d O's %s%n", countO, stars[3]); System.out.printf("%d U's %s%n", countU, stars[4]); }
方案2:用Map关联元音和星号,更简洁直观
如果不想用数组,用Map能避免索引搞混的问题,代码可读性更高:
import java.util.HashMap; import java.util.Map; public void printStars(String inputString) { Map<Character, String> vowelStars = new HashMap<>(); // 初始化每个元音对应的星号为空字符串 vowelStars.put('a', ""); vowelStars.put('e', ""); vowelStars.put('i', ""); vowelStars.put('o', ""); vowelStars.put('u', ""); Map<Character, Integer> vowelCounts = new HashMap<>(); vowelCounts.put('a', 0); vowelCounts.put('e', 0); vowelCounts.put('i', 0); vowelCounts.put('o', 0); vowelCounts.put('u', 0); // 转小写统一处理,兼容输入里的大写元音 for (char c : inputString.toLowerCase().toCharArray()) { if (vowelStars.containsKey(c)) { vowelCounts.put(c, vowelCounts.get(c) + 1); vowelStars.put(c, vowelStars.get(c) + "*"); } } System.out.println("Sentence: " + inputString); System.out.printf("%d A's %s%n", vowelCounts.get('a'), vowelStars.get('a')); System.out.printf("%d E's %s%n", vowelCounts.get('e'), vowelStars.get('e')); System.out.printf("%d I's %s%n", vowelCounts.get('i'), vowelStars.get('i')); System.out.printf("%d O's %s%n", vowelCounts.get('o'), vowelStars.get('o')); System.out.printf("%d U's %s%n", vowelCounts.get('u'), vowelStars.get('u')); }
额外小提醒
可以把输入字符串先转成小写,这样不用单独处理大写元音的情况,代码会更健壮哦~
内容的提问来源于stack exchange,提问作者Dorkymon
相关产品推荐
相关产品推荐

