You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:02:32