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

Java单词按字母排序程序编译报错:sarr未声明变量,求解决方案

Java单词按字母排序程序编译报错:sarr未声明变量,求解决方案

嗨,我来帮你梳理下这个问题的根源,以及怎么修复它!

问题原因分析

你遇到的sarr未声明的报错,核心是变量作用域的问题:

  • 你把String sarr[] = new String[c];声明在了if的代码块内部,根据Java的规则,代码块内声明的变量只能在该代码块里访问,出了这个if块,外部就识别不到它了。
  • 另外还有两个潜在问题:
    • main方法的签名不对,Java要求main方法必须是public static void main(String[] args),少了String[] args会导致程序无法正常运行。
    • 变量c只在if块里赋值,如果输入的句子结尾不是@或.,c会处于未初始化状态,后面的for循环用它也会报错。

修复后的代码

我把这些问题都修正了,你可以参考下面的代码:

import java.util.*;

public class StringPractise2 {

    // 修正main方法的签名,加上String[] args
    public static void main(String[] args) {
        String temp;
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the sentence:");
        String s = sc.nextLine();
        s = s.toUpperCase();
        int l = s.length();
        // 提前声明sarr并初始化,同时给c一个默认值
        String sarr[] = new String[0];
        int c = 0;

        if (s.charAt(l - 1) == '@' || s.charAt(l - 1) == '.') {
            StringTokenizer str = new StringTokenizer(s, "@.");
            c = str.countTokens();
            // 这里只需要给sarr重新赋值,不需要再声明
            sarr = new String[c];
            for (int i = 0; i < c; i++) {
                sarr[i] = str.nextToken();
            }
            // 冒泡排序部分保持不变
            for (int i = 0; i < c; i++) {
                for (int j = i + 1; j < c; j++) {
                    if (sarr[i].compareTo(sarr[j]) > 0) {
                        temp = sarr[i];
                        sarr[i] = sarr[j];
                        sarr[j] = temp;
                    }
                }
            }
        }

        System.out.println("The original sentence:" + s);
        // 加个判断,避免c为0时进入循环导致数组越界
        if (c > 0) {
            System.out.println("The array is alphabetical order:");
            for (int i = 0; i < c; i++) {
                System.out.print(sarr[i] + " ");
            }
        } else {
            System.out.println("输入的句子结尾不符合要求(需要以@或.结尾),无法生成排序后的数组");
        }
    }
}

关键修改点说明

  • 变量作用域调整:把sarr的声明移到if块外面,这样整个main方法里都能访问到它,同时初始化一个空数组避免空指针。
  • 修正main方法签名:加上String[] args,符合Java程序入口的要求。
  • 初始化变量c:给c默认值0,避免if条件不满足时出现未初始化的编译错误。
  • 增加边界判断:在打印数组前判断c>0,防止输入不符合要求时出现数组越界的运行时错误。

这样修改后,你的程序就能正常编译运行啦~

备注:内容来源于stack exchange,提问作者Sagarika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:14:51