3.7. Fejl

Som sagt udfører computeren programmet instruktion som en kogebogsopskrift. Computeren forstår ikke programmet, men udfører blot det, programmøren (kogebogsforfatteren) har skrevet.

3.7.1. Indholdsmæssige (logiske) fejl

Da maskinen ikke forstår programmet, kan den heller ikke rette op på fejlene i programmørens opskrift eller forstå, hvad programmøren "mener" med det, han skrev. Man kan altså sagtens komme til at lave et program, der gør noget andet end det, der var tilsigtet:

 
public class ProgramMedFejl 
{ 
  public static void main (String[] args) 
  { 
    System.out.println("Hej Verdne!"); 
    int sum = 2 - 2; 
    System.out.println("2 og 2 er "+sum); 
  } 
} 

Resultatet bliver

 
Hej Verdne! 
2 og 2 er 0 

Dette eksempel har en stavefejl og en forkert udregning. I Afsnit 3.5.4 om uendelige løkker så vi en anden fejl, der gjorde, at programmet aldrig stoppede. Et andet eksempel kunne være et skatteprogram, der glemmer at tage højde for bundfradraget.

3.7.2. Sproglige fejl

Mens computeren ikke har mulighed for at finde indholdsmæssige fejl i programmerne, kan den godt finde sproglige og syntaksmæssige problemer, dvs. hvis kildeteksten gør brug af ukendte variable eller metoder eller ikke er gyldig i forhold til sprogets syntaks (den formelle definition af, hvordan man skriver javakode).

Hvis der er sproglige fejl i kildeteksten, kan den ikke oversættes til bytekode, så man kan altså overhovedet ikke komme til at prøve sit program. De følgende instruktioner er alle forkerte, og vil blive fanget under oversættelsen af programmet. Ofte kan fejlmeddelelsen overraske lidt, men med lidt øvelse kan man lære at forstå den "firkantede", måde som computeren "tænker" på:

 
    System.out.println("Hej verden!); 

Her mangler en slut-" til at markere, hvor strengen stopper. Oversætteren skriver unclosed character literal. Den kan ikke regne ud, at strengen slutter lige før ')'.

 
System.out.pintln("Hej verden!"); 

Kaldet til println er stavet forkert. Oversætteren skriver method pintln(java.lang.String) not found in class java.io.PrintStream. Den kan ikke finde ud af, at man mener println (med r) i stedet for pintln.

 
system.out.println("Hej verden!"); 

System er stavet forkert (med småt). Oversætteren skriver cannot access class system.out; neither class nor source found for system.out. Den skelner mellem store og små bogstaver og kan ikke se, at man mener System (med stort) i stedet for system.

 
System.out.println(Hej verden!); 

Der mangler " til at markere, hvor strengen starter og slutter. Oversætteren skriver ')' expected og peger lige efter Hej. Den forstår ikke at "Hej verden!" er en tekststreng, når "-tegnene mangler, og mener derfor, at 'Hej' og 'verden!' skal behandles adskilt.

Når man skal finde en fejl, gælder det om at nærlæse fejlmeddelelsen og programkoden omkring stedet, hvor fejlen er, og at huske, at computeren følger faste regler, men ikke forstår hvad der foregår. F.eks. er den sidste fejlmeddelelse ')' expected ikke særlig sigende, da fejlen formentlig er, at der mangler "-tegn.

Det kan være banaliteter, der er årsag til sprogfejl. Det giver ofte anledning til sprogfejl, at folk glemmer, at der er forskel på store og små bogstaver.

Java skelner altid mellem store og små bogstaver

Det er god stil konsekvent at skrive klassenavne med stort og variabler og metoder med småt

3.7.3. Køretidsfejl

Visse fejl opstår først ved udførelsen af programmet. Selvom alting er syntaktisk korrekt, opstår der alligevel en undtagelse fra den normale programudførelse. Herunder ses et program, der stopper på grund af division med 0.

 
public class ProgramMedFejl2 
{ 
  public static void main (String[] args) 
  { 
    int a,b,c; 
 
    a = 5; 
    b = 6; 
 
    c = b/(a-5); 
    System.out.println("c = "+c); 
  } 
} 
 
Exception in thread "main" java.lang.ArithmeticException: / by zero 
        at ProgramMedFejl2.main(ProgramMedFejl2.java:10) 

Køretidsfejl forårsager, at der opstår en undtagelse (eng.: exception), som, hvis den ikke håndteres, stopper programudførelsen (populært: programmet går ned). Dette vil blive behandlet grundigere i kapitlet om undtagelser.