java - javac viser ikke compiler fejl?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg underviser i min ven nogle Java, og vi kører i problemer, der forsøger at køre kompilatoren på hendes Hello World-program. Koden havde en temmelig strålende fejl (Sysrem.out.println), men ellers var helt gyldig Java, men af ​​en eller anden grund har kompilatoren ikke rapporteret fejlen. Her er hvad der skete:



  1. Når vi kørte javac Hello.java i Windows Command Prompt, udskrev den en tom linje og derefter en ny kommandopromptlinje, som om operationen lykkedes, men det havde tydeligvis ikke været en klassefil oprettet, og selvfølgelig havde koden en fejl, så vi vidste, at det ikke ville lykkes.

  2. Når vi kørte javac -verbose Hello.java, udskrev den de gory detaljerne i de klassefiler, den blev indlæst, men så var det det. Mens det ikke sluttede med at sige, at det havde skrevet en klassefil, blev det heller ikke udskrevet.

  3. Når vi har rettet fejlen, kompilerede programmet og løber uden problemer, så det synes at være, at javac ikke kan lide at udskrive compilerfejl.



Hvad kunne der foregå her, hvorfor er det ikke kompilatoren, der rapporterer denne fejl som den burde?


Den komplette kode:


public class Hello {

    public static void main(String[] args) {
        Sysrem.out.println("Hello, world!");
    }

}


Kommandoprompten:


C:UsersMyFriendsNameDocuments>javac Hello.java

C:UsersMyFriendsNameDocuments>

Bedste reference


Nå har jeg opdaget problemet: Det viser sig, at min ven aldrig havde ramt Gem på hendes fil efter at have skabt den, og i det jeg antager, er bare noget uintuitivt designet forventet adfærd, klager javac ikke på at blive fodret blank fil!


Her er præcis hvad der skete:



  • Opret filen

  • Skriv buggy-koden, men gem ikke filen

  • Forsøg at kompilere koden og hit problemet, der er beskrevet i mit spørgsmål

  • Ret fejlen i koden og gem filen

  • Kompilér og kør koden uden problemer


Andre referencer 1


Hvad det egentlig kendetegner er, om en tom fil er et gyldigt Java-program. Overraskende er det!


Her er grammatikken til en CompilationUnit ... hvilket er det tekniske udtryk, som JLS bruger til en Java-kildefil:


CompilationUnit:
   OrdinaryCompilationUnit
   ModularCompilationUnit

OrdinaryCompilationUnit:
   [PackageDeclaration] {ImportDeclaration} {TypeDeclaration}

ModularCompilationUnit:
   {ImportDeclaration} ModuleDeclaration


(Reference: JLS 7.3) [10]


Bemærk at elementet OrdinaryCompilationUnit giver dig mulighed for at have en kildefil, der består af:



  • ingen pakningsopgørelse

  • Ingen importerklæringer

  • Ingen typeerklæringer



Med andre ord, en tom fil eller en fil, der bare indeholder kommentarer.


Kort sagt, hvis du fortæller javac at kompilere en tom fil, vil det ikke producere nogen kompileringsfejl ... fordi det er 'gyldig' Java kildekodefil.