Nada

Föreläsning 18 - Felhantering, avlusning, särfall

Goda råd

Råden är inte vetenskapligt underbyggda utan speglar mest kursledarens fördomar. Det är tillåtet att följa sitt eget huvud i dessa frågor. På egen risk...
  1. Rita skärmens utseende vid en tänkt körning.
  2. Beskriv algoritmen i ord, alltså hur du själv skulle lösa uppgiften om du extraknäckte som dator,
  3. Rita och namnge datastrukturer som behövs och eventuella grafiska komponenter.
  4. Programmera en prototyp, alltså ett bluffprogram som ser rätt ut men som inte gör just någonting av värde.
  5. Utveckla steg för steg, provkör och låt gärna andra provköra.

Ett lampexempel

Hur programmerar man det här trevliga spelet?

Varför inte börja med en prototyp enligt nedan och sedan utveckla den? Det slutliga programmet finns här;
import java.awt.*                                           ;
import java.applet.*                                        ;

public class Lampor extends Applet                          {
    static final int m=3, n=4                               ;
    int tryckningar=0                                       ;
    Label rubrik=new Label("Alla rum ska lysa!")            ;
    Panel plan = new Panel()                                ;
    Label antal = new Label("Antal:"+tryckningar)           ;
    Button omstart=new Button("Omstart")                    ;

    public void init()                                      {
	add(rubrik)                                         ;
	plan.setLayout(new GridLayout(m,n))                 ;
	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++)         {
	    plan.add(new Button())                          ;}
	add(plan)                                           ;
	add(antal)                                          ;
        add(omstart)                                        ;}}

Debugging - avlusning

Redan på femtiotalet kallades programfel för löss (eng. bug) eftersom man brukade skylla ifrån sej på småkryp som tagit sej in i komponenterna (som ju då var reläer). Det finns två sätt att avlusa programmet.
  1. Om man arbetar i en Javamiljö som Visual J++ eller Symantec Cafe kan man stega sej fram sats för sats och samtidigt se hur variabelvärdena ändras.
  2. Utan javamiljö stoppar man in hjälputskrifter i programmet, helst av typen
    if(DEBUG) System.out.println("x="+x);
    där man har deklarerat en global variabel
    static boolean DEBUG=false;
    Ett elegant sätt att debugga utan omkompilering är att låta det styras av extraord på kommandoraden, alltså till exempel
    java Swahili DEBUG.
    Det är bara att låta main börja så här:
    public static void main(String[] args){
    if(args.length>0) DEBUG=true;

Exception - särfall

Ibland kraschar en körning med ett felmeddelande av typen
java.lang.NullPointerException at Dum.main(Dum.java:8)
Kollar man rad 8 i filen Dum.java ser man att man försökt använda ett objekt som är null. Andra saker som kan få ett program att krascha är division med noll, för stort index i en vektor, oväntade tecken vid läsning av tal och oväntat filslut. Så här kan man förhindra felavbrott vid för stort vektorindex.
class JagHeter                                           {
    public static void main(String[] args)               { 
	try                                              { 
	    System.out.print("Din son ska heta ")        ;
	    System.out.println(args[0]+"sson")           ;}
	catch(ArrayIndexOutOfBoundsException e)          {
	    System.out.println("... vad heter du själv?");}}}
Det som egentligen händer när konstigheten inträffar är att programflödet bryts, ett informationsobjekt av klassen Exception (sve. särfall) skapas och kastas iväg neråt i programkoden. Om ingen fångar särfallet bryts körningen och informationen skrivs ut på skärmen.
Om särfallet uppstår inne i ett anrop kan man låta metoden kasta tillbaks det till huvudprogrammet så här.
class Dum                                               {
  static int kvot(int x, int y) throws Exception        {
      if(y==0) throw(new Exception("Division med noll"));
      return x/y                                        ;}
  public static void main(String[] args)                {
      try                                               {
	System.out.println("5/2="+kvot(5,2))            ;
	System.out.println("3/0="+kvot(3,0))            ;
	System.out.println("6/3="+kvot(6,3))            ;}
      catch(Exception e)                                {
	  System.out.println(e)                         ;}}}

Sidansvarig: <henrik@nada.kth.se>
Senast ändrad 13 april 2000
Tekniskt stöd: <webmaster@nada.kth.se>