java - 不理解Java中的一些基本编译错误

标签 java compiler-errors

我已经学习 Java 两个月了,每次我认为我开始掌握它时,我意识到我仍然缺乏一些扎实的基础知识。

目前正在准备考试,其中一项练习是检测编译错误。虽然给出了答案,但我仍然不明白其中大部分错误。

这是代码:

boolean b = true;
String s;
char c = '8';                    // unicode = 56
byte k = 6;
int i = 7;

b = !b < false;                  // compilation error #1
s = k + c + "" + (c < 8);
s = k + c + (c < 8) + "" ;       // compilation error #2
c = c + 1;                       // compilation error #3
b = b + "";                      // compilation error #4
c++;
b = true == (!(true != !(i != 7)) !=b || (c < '2'));
b = (true || false) == 1 && b;   // compilation error #5

我了解错误 #1 和 #5。

我不明白错误 #2。看起来是一个int和一个boolean相加的问题,但是如果是这样的话,为什么之前那行没有编译错误呢,这正是同一行代码减去“”的位置和(c<8)。我之前见过 boolean 字符串的编译没有错误,例如

(5 < 3) + "ok" = "falseok"

这是否意味着 boolean 值的串联只能通过 Stringchain 完成,而不能通过其他原语完成?那为什么第二行可以编译呢?

我不明白错误#3。编译器说:“不兼容的类型:从 int 到 char 可能有损转换”。为什么 char 不隐式转换为 int?我们在类里面了解到,如果在与 和 it 相同的等式中,byte、short 和 char 类型可以自动转换为 int,那么为什么这里不会发生这种情况呢?

我不明白错误#4。编译器说:“不兼容的类型:java.lang.String无法转换为 boolean 值”。与 #1 相同,为什么在这种情况下不接受 booleanString 连接?

非常感谢。

最佳答案

  • #2 发生是因为 c<8评估为 boolean无法添加到 int 。该行没有编译错误 之前因为boolean表达式转换为String 在连接之前。 请注意顺序很重要!s = k + c + (c < 8) + ""不是有效的表达式,s = "" + k + c + (c < 8)是一个。
  • #3 出现是因为表达式 c + 1计算结果为int其存储大小大于 char ,所以有 像这样转换:(char) (c + 1) .
  • #4 发生是因为您无法分配 String表达式为 boolean变量

看看 + operator 的规范了解实际发生的情况以及narrowing primitive conversion部分了解为什么需要 Actor 阵容。

不要担心从一开始就无法理解一切:我们都是从那里开始的。随着时间的推移,Java 积累了一些特性。您能做的最好的事情(恕我直言)就是学习阅读规范。

关于java - 不理解Java中的一些基本编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58551420/

相关文章:

android - 错误找不到符号变量 FileProvider 包 android.support.v4.content 不存在

file - 处理时output.println()中的错误

java - 将值插入数据库

java - 让计时器作为 lambda 执行

java - 在哪里可以找到 com.mathworks.jmi 包

java - 使用通用类和通用集合类型的声明有什么区别

java - 使用 simple-framework 更新 xml 文件

php - 如何解决这个 PHP 通知错误?

visual-studio - 类模块中断与未处理错误中断(VB6 错误捕获,IDE 中的选项设置)

linux - 将 GAS 与 .intel_syntax 一起使用时出错