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
相关产品推荐
相关产品推荐

