Wie kann Eclipse eine Klasse mit ungelösten Kompilierungsproblemen erstellen?
Lesezeit: 4 Minuten
Evgeniy Dorofeev
Wenn ich versuche, diese Klasse mit Javac zu kompilieren, erhalte ich einen Kompilierungsfehler und Test.class wird nicht erstellt.
public class Test {
public static void main(String[] args) {
int x = 1L; // <- this cannot compile
}
}
Aber wenn ich diese Klasse in Eclipse erstelle, kann ich sehen, dass Test.class in target/classes erscheint. Wenn ich versuche, diese Klasse über die Befehlszeile mit java.exe auszuführen, bekomme ich
Ausnahme im Thread “main” java.lang.Error: Ungelöstes Kompilierungsproblem:
Typenkonflikt: Konvertieren von long nach int nicht möglich
Verwendet Eclipse seinen eigenen speziellen Java-Compiler, um eine defekte .class zu erstellen? Woher weiß java.exe von Kompilierungsproblemen in .class?
+1. Gute Frage, darüber habe ich noch nie nachgedacht 🙂
– Marun
6. Mai 2013 um 7:47 Uhr
Raul
So weiß der Java-Compiler von dem Kompilierungsfehler in der Klasse.
public static void main(String[] paramArrayOfString)
{
throw new Error("Unresolved compilation problem: \n\tType mismatch: cannot convert from long to int.\n");
}
Wenn Sie Ihre Klassendatei dekompilieren, können Sie das Obige sehen main() Methode der Klassendatei, die der Compiler erzeugt hat. Dies liegt an der Compiler die Eclipse verwendet (Eclipse-Compiler für Java) ist nicht dasselbe wie der Standard-Java-Compiler!
Also nutzt es nicht javacdann kann jemand nach dem Löschen eine .java-Datei in Eclipse kompilieren javac.exe Datei aus dem JDK-Kit? Nur neugierig. 🙂
– CᴴᴀZ
6. Mai 2013 um 17:34 Uhr
@ChaZ – Sehen Sie sich diese Frage an. Zitieren einer Zeile aus der Antwort dort – The fact that Eclipse comes with its own compiler is also apparent because you can write, compile, and run Java code in Eclipse without even installing the Java SDK. Ich hoffe, das weckt Ihre Neugier! 🙂
– Raul
7. Mai 2013 um 3:18 Uhr
Peter Lawrey
Eclipse verwendet den IBM-Compiler, der die Möglichkeit bietet, Klassen zu erstellen, die nicht kompiliert werden, und Fehler durch ersetzt
throw new Error();
IMHO, das ist eine sehr schlechte Praxis und ich habe gesehen, dass einige Projekte von sehr schlechter Qualität dies verwenden. Das Projekt wurde wochenlang nicht vollständig kompiliert.
Im Gegensatz zu Fail-Fast-Strategien, die versuchen, die Kosten von Fehlern zu minimieren, maximiert das späte Entdecken von Fehlern auch die Kosten für ihre Behebung.
Diese Strategie funktioniert nur, wenn Sie schnell Prototypcode schreiben, dh Code, von dem Sie wissen, dass er nie in Produktion gehen wird. (Es ist schwer sicher zu sein, dass dies der Fall sein wird)
Klingt für mich nach Todesruf. Wenn ich einen Code schreibe, versuche ich oft, und ich denke, die meisten Leute sollten es versuchen, den Code zur Kompilierzeit kaputt zu machen, anstatt ihn als Fehler loszulassen und bei der Produktion zu brechen. Jetzt darf der offensichtliche Kompilierzeitfehler verschleiert werden, was tödlich sein kann /
– Mawi
6. Mai 2013 um 7:44 Uhr
Ich denke, in Verbindung mit all dieser Inhaltshilfe, Autokorrektur, Hervorhebung, Paket-Explorer, … Eclipse bietet Ihnen solche Fehler fast nicht. Aus meiner Sicht ist es in Ordnung, Klassen zu testen, die nicht kompiliert werden, zum Beispiel müssten Sie nach der Implementierung einer Schnittstelle mehrere nutzlose Rückgaben zum Testen einer einzigen Methode schreiben … Ich denke, das würde zu hartnäckigen Diskussionen führen, ich wollte nur eine Alternative anbieten.
– Franz Ebner
6. Mai 2013 um 7:50 Uhr
@FranzEbner Es sollte keine Chance geben, dass Sie Code ausführen, der nicht einmal kompiliert wird. 😉 IMHO ist Mocking-Code eine bessere Möglichkeit, Schnittstellen in Tests zu handhaben.
– Peter Lawrey
6. Mai 2013 um 7:53 Uhr
Der Vorteil des Eclipse-Compilers, der dies zulässt, besteht darin, dass Sie vorhandenen Code tatsächlich ausführen können, während Sie neuen Code (der noch nicht kompiliert wird) auf Ihrem eigenen Computer schreiben.
– Thorbjørn Ravn Andersen
6. Mai 2013 um 8:02 Uhr
@PeterLawrey Ich stimme zu, dass das absichtliche Versenden von Code, der nicht kompiliert wird, eine schlechte Sache ist. Hätten die von Ihnen erwähnten „Projekte mit sehr schlechter Qualität“ von der Einführung eines Bauroboters profitiert?
– Thorbjørn Ravn Andersen
6. Mai 2013 um 9:09 Uhr
Erich Schubert
Ja, Finsternis verwendet einen eigenen speziellen Compiler; bekannt als “ecj”. Aus der Stack Overflow-Frage Was ist der Unterschied zwischen Javac und dem Eclipse-Compiler?:
Ein bemerkenswerter Unterschied besteht darin, dass Sie mit dem Eclipse-Compiler Code ausführen können, der nicht richtig kompiliert wurde. Wenn der Codeblock mit dem Fehler nie ausgeführt wird, wird Ihr Programm problemlos ausgeführt. Andernfalls wird eine Ausnahme ausgelöst, die anzeigt, dass Sie versucht haben, Code auszuführen, der nicht kompiliert werden kann.
11457200cookie-checkWie kann Eclipse eine Klasse mit ungelösten Kompilierungsproblemen erstellen?yes
+1. Gute Frage, darüber habe ich noch nie nachgedacht 🙂
– Marun
6. Mai 2013 um 7:47 Uhr