Java:在运行Eclipse bug时出现"9"吗?

Kel*_*sey 6 java eclipse

在为计算机约会分配编写我的代码时,我们看到了四个对象数组的兼容性,我的代码打印得很奇怪.(Eclipse最初没有给我一个错误/警告).

码:

System.out.print("Fit between " + profile1.getTitle() + " and " + profile2.getTitle() + ": \n   " +
       + '\t' + profile1.fitValue(profile2) + '\n');
Run Code Online (Sandbox Code Playgroud)

当我试图打印出来时,它们看起来像这样:

适合Elizabeth Bennett和Elizabeth Bennett:90.0

适合Elizabeth Bennett和Fitzwilliam Darcy:90.55

适合伊丽莎白贝内特和罗密欧蒙塔古:90.3

适合Elizabeth Bennett和Juliet Capulet:90.0

.................................................. .....等等.

在我的号码前面出现了一个"9".

我后来发现了这个问题:我的"\n"后面有两个连接运算符("+").所以我改变了我的代码,删除了无关的"+".

新代码:

System.out.print("Fit between " + profile1.getTitle() + " and " + profile2.getTitle() + ": \n   " +
       '\t' + profile1.fitValue(profile2) + '\n');
Run Code Online (Sandbox Code Playgroud)

新的正确运行:

适合Elizabeth Bennett和Elizabeth Bennett:0.0

适合Elizabeth Bennett和Fitzwilliam Darcy:0.55

适合Elizabeth Bennett和Romeo Montague:0.3

适合Elizabeth Bennett和Juliet Capulet:0.0

..............................................等等.

虽然我很幸运地发现了我的问题,但我想知道究竟是什么导致了这种情况发生.是否有某种日食速记导致"9"的出现?或者这是由于一些日食错误?我还是java的初学者,所以我无法得出可靠的结论.

我尝试稍微修改我的代码,看看Eclipse会如何反应(我删除了原来的"+ +"之间的空格):

System.out.print("Fit between " + profile1.getTitle() + " and " + profile2.getTitle() + ": \n   " ++
       '\t' + profile1.fitValue(profile2) + '\n');
Run Code Online (Sandbox Code Playgroud)

Eclipse给了我这个警告:

此行有多个标记

  • 令牌"++"上的语法错误,+预期

  • 操作的参数无效++/ -

这是有道理的,因为++本身就是各种运算符.有趣的是,如果我在"++"之间放置一个空格,那么警告就会消失.

为了便于阅读,我没有粘贴整个代码,但如果有必要,我可以编辑并添加它.对此有一些澄清会很有帮助.谢谢.

Jon*_*eet 6

不,这不是一个错误.这很不寻常,但这不是一个错误.

首先要做的是大量简化示例:

public class Test {
    public static void main(String[] args) {
        String start = "Start";
        String end = "End";
        System.out.println(start + '\t' + end);
        System.out.println(start + +'\t' + end);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

Start   End
Start9End
Run Code Online (Sandbox Code Playgroud)

诚然,现在我使用的字符串既startend,但由于+被左结合的,不会使这里的任何差异.(如果start是整数,则+在这两种情况下,第一个二元运算符将是整数加法.)

基本上,多余的+结束是一个一元+运算符'\t'操作数.一元数字促销应用于char,int结果给出.所以代码变得有效:

System.out.println(start + +((int)'\t') + end);
Run Code Online (Sandbox Code Playgroud)

这是有效的:

System.out.println(start + +(9) + end);
Run Code Online (Sandbox Code Playgroud)

这是有效的

System.out.println(start + 9 + end);
Run Code Online (Sandbox Code Playgroud)

...在这一点上,我们很清楚你为什么要得到你的输出.

为了避免意外地将字符视为整数,最好只使用字符串 - 此时代码将无法编译,因为没有一元运算+String:

System.out.println(start + +"\t" + end);
Run Code Online (Sandbox Code Playgroud)

......给出:

Test.java:6: error: bad operand type String for unary operator '+'
Run Code Online (Sandbox Code Playgroud)


Cod*_*der 5

问题不仅+ +在于你的代码.但它也是因为你使用的是char '\t'而不是String "\t".

因此,当您使用时System.out.println("Hello" + '\t');,将\t其作为字符文字并附加到字符串中\t.

但是当你使用时System.out.println("Hello" + + '\t');,它会变得有效System.out.println("Hello" + (+ '\t'));.所以它被视为intjava.您只能分配+-签署整数而不是字符.

记住你可以做int i = +2-2+ +2.

并且ASCII值\t9.因此它被附加到字符串并得到打印为Hello9.