Salut,
Après m'être bien cassé la tête à comprendre pourquoi mon programme faisait n'importe quoi, j'ai fini par tomber sur un cas qui compile sous Eclipse Neon (java 1.8), mais pas avec javac en console, et qui donne un résultat pour le moins délirant. Bien sûr, il y avait bien une erreur dans le code, et ça ne devrait pas compiler, donc encore moins s'exécuter. J'ai extrait le cas dans un snippet et reproduit.
Si quelqu'un pouvait me confirmer que ça le fait aussi sur son environnement (et que ce n'est pas quelque chose de particulier sur mon environnement) avant que je poste le problème sur le bugzilla, ça m'intéresse.
Voici le code :
L'exécution donnant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 public class Snippet { public static void main(String[] args) { System.out.println("starting..."); if ( false ) { System.out.println("this is executed, but it should not !?"); } else { System.out.println("this is still executed..."); sampleMethod(42, id1-> (p1, id2)-> otherMethod())); } System.out.println("...finishing"); } public static interface I1 { I2 create(String id); } public static interface I2 { Class1 get(Class2 something, String somethingElse); } public static class Class1 { } public static class Class2 { } public static void sampleMethod(int param1, I1 param2) { System.out.println("sample method invoked"); } public static Class1 otherMethod() { System.out.println("other method invoked"); return new Class1(); } }
Remarquez, il y a un délire++... dans la ligne sampleMethod(42, id1-> (p1, id2)-> otherMethod()));, je peux mettre n'importe quoi à la place des noms de méthodes (sampleMethod et otherMethod), genre eclipse(42, id1-> (p1, id2)-> delire())); ça continue de compiler et de s'exécuter...starting...
this is executed, but it should not !?
this is still executed...
Partager