你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。为了输出更好的内容,我就必须先输入更多的内容,于是我选择 Stack Overflow 作为学习的第一战线,毕竟很多大牛都在强烈推荐。本篇文章,我们来探讨一下访问量足足有 87+ 万次的问题——什么是“找不到符号”,它是什么意思,它是如何发生的,以及如何修复它。
额外多 BB 几句。坚持写作这些年来,真的成长特别快,我建议你也行动起来——我坚信,学习不在入,而在出!
如果你还有啥想看的、想了解的,欢迎在评论区留言!我会的、我能写的,我都非常乐意分享出来,和你共同成长!接下来,我们来看正文。
01、“找不到符号”错误是什么意思
先来看一段代码:
String s = String();
有点经验的 Java 程序员应该能够发现上面这段代码中的错误,它缺少了一个 new 关键字。因此,这段代码在编译阶段是不会通过的。
当我们对编译错误置之不理,尝试运行它的时候,程序会抛出以下错误。
“找不到符号”,意味着要么源代码有着明显的错误,要么编译方式有问题。总之呢,是我们程序员搞的鬼,把编译器搞懵逼了,它有点力不从心,很无辜。
02、“找不到符号”是如何发生的
1)拼写错误
程序员毕竟也是人,是人就会犯错。
单词拼错了,比如说把 StringBuilder 拼写成了 StringBiulder。
StringBuilder sb = new StringBiulder(); // 找不到符号,类 StringBiulder
1
大小写错了,比如说把 StringBuilder 拼写成了 Stringbuilder。
StringBuilder sb = new Stringbuilder(); // 找不到符号,类 Stringbuilder
1
2)未声明变量
有时候,我们会在没有声明变量的情况下使用一个变量。
System.out.println(sss); // 找不到符号,变量 sss
或者变量超出了作用域。
for (int i = 0; i < 100; i++);
{
System.out.println("i is " + i);
}
上面这段代码很不容易发现错误,因为仅仅是在“{”前面多了一个“;”。“;”使得 for 循环的主体被切割成了两个部分,“{}”中的 i 超出了“()”中定义的 i 范围。
3)方法用错了,或者不存在
比如说,Java 如何获取数组和字符串的长度?length 还是 length()?
String[] strs = {"沉默王二"};
System.out.println(strs.length()); // 找不到符号,方法 length()
String str = "沉默王二";
System.out.println(str.length); // 找不到符号,变量 length
4)忘记导入类了
在使用第三方类库的时候,切记要先导入类。
StringUtils.upperCase("abcd");// 找不到符号,类 StringUtils
不过,IDEA 中可以设置类自动导入,来避免这个错误。
。。。。。。
导致出现“找不到符号”的错误原因千奇百怪,上面也只是列举出了其中的一小部分。问题的根源在于程序员本身,随着编程经验的积累,以及集成开发工具的帮助,这些错误很容易在代码编写阶段被发现。
03、如何修复“找不到符号”错误
一般来说,修复“找不到符号”的错误很简单,要么根据 IDE 的提示在编写代码的时候直接修复;要么根据运行后输出的堆栈日志顺藤摸瓜。
日志会给出具体的行号,以及错误的类型。根据提示,想一下自己的代码要表达什么意思,然后做出修复的具体动作。比如上图中提醒我们 35 行代码出错了,找不到变量 j,那么就意味着我们需要给变量 j 一个类型声明即可。
04、更复杂的原因
在实际的项目当中,出现“找不到符号”的错误原因往往很复杂,但大多数情况下,可以归结为以下几点:
编码格式不对。比如说应该是 UTF-8,但有些遗留的项目会设置为 GBK、GB2312 等等。
JDK 的版本不匹配。比如说某些团队成员的电脑上安装的是 JDK 1.6,有的是 JDK 8,版本升级后的一些新语法自然就会和老版本发生冲突。
第三方类库的升级。一些开源的共同类库往往会不兼容旧的版本,比如说最新版的 StringUtils 类的包为 org.apache.commons.lang3,但之前是 org.apache.commons.lang。
类名和方法名都相同,但包名不同,方法的参数不同,在使用的时候就容易造成“找不到符号”。
在我初学 Java 的时候,老师要求我们用记事本来编写代码,然后在命令行中编译和运行代码,那时候真的叫一个痛苦啊。
经常出现“找不到符号”的错误,差点入门到放弃。因为初学阶段,哪能记住那么多编程语言的规则啊,经常忘东忘西,再者记事本是没有行号的,找起问题来,简直要了老命。
吃过这样的苦后,我就强烈建议初学者不要再使用记事本编程了(莫装逼),直接上 IDE,有啥问题,工具帮你悠着点。
05、鸣谢
好了,我亲爱的读者朋友,以上就是本文的全部内容了。毫无疑问,能看到这里你在我心目中就是最棒的求知者,我必须要伸出大拇指为你点个赞????。如果还想看到更多,我再推荐你 2 篇,希望你能够喜欢。