10. Methoden in Java

Hopelijk heb je inmiddels begrepen wat een methode in Java voorstelt. Een methode is een stukje programma dat een bepaalde taak verricht. Telkens als je wilt dat een programma die bepaalde taak verricht, kun je zo'n methode aanroepen.

Java zelf heeft een zeer groot aantal methodes. Elk van die methodes hoort bij een bepaalde klasse.

Wil je bijvoorbeeld een tekst uit een tekstvak halen, dan kun je gebruik maken van de methode getText(), die je koppelt aan objecten van de klasse TextField. En voor het produceren van willekeurige getallen hebben we random() uit de klasse Math.

En je herinnert je misschien ook nog dat je een teken uit een string kunt krijgen met de methode charAt(), die gekoppeld wordt aan objecten uit de klasse String.

Maar ook al kent Java honderden methoden, die allerlei handige taken kunnen verrichten, toch kan het gebeuren dat je een methode zoekt die in Java niet bestaat. In zo'n geval kun je ervoor kiezen die methode zelf te maken.

   

Een void methode

Voor we verder gaan, even een opmerking: wil je echt een driehoek (of andere figuur) tekenen, dan kun je de Java-methoden drawPolygon, en fillPolygon gebruiken. Je kunt deze vinden in hoofdstuk 13. De hier besproken methode is voornamelijk bedoeld om te laten zien hoe een void methode werkt.

Stel dat je een methode wil maken die een driehoek tekent, dan kunnen we zo'n methode driehoek noemen.

De methode moet beschikken over de coördinaten van de drie hoekpunten, ofwel (x1,y1), (x2,y2) en (x3,y3). En natuurlijk moet de methode kunnen tekenen, dus we moeten een object van de klasse Graphics meegeven.

Om de driehoek te tekenen gaan we onze methode als volgt aanroepen:

driehoek (g, x1,y1, x2,y2, x3,y3);

Je ziet: aan deze methode worden g (een object van de klasse Graphics) en driemaal twee coördinaten meegegeven. Maar Java moet ook weten wat voor waarde deze methode aflevert. Bij het definiëren van de methode wordt dat gedaan in de zogenaamde kopregel op de volgende manier:

void driehoek (Graphics g, int x1, int y1, int x2, int y2,
                                          int x3, int y3) {

Dat de hoekpunten x1, y1, x2, y2, x3, y3 van het type int zijn, is duidelijk. Dat g van het type Graphics is, valt ook nog wel te begrijpen.

Maar wordt er bedoeld met de aanduiding void? Een methode kan een waarde afleveren. Zo zou een methode die twee hele getallen optelt aldus gedefinieerd kunnen worden:

int telop (int getal1, getal2) {
   // rest van de methode ...

Deze methode moet een heel getal afleveren, en is dus van het type int.

Maar niet alle methoden leveren een waarde af. Sommige methoden moeten bijvoorbeeld alleen maar tekenen. Een methode die geen waarde aflevert, is van het type void (Engels void = ledig, zonder waarde).

De rest van onze methode driehoek is niet zo moeilijk te begrijpen:

void driehoek (Graphics g, int x1, int y1,
            int x2, int y2, int x3, int y3) {
   g.drawLine (x1, y1, x2, y2);
   g.drawLine (x2, y2, x3, y3);
   g.drawLine (x3, y3, x1, y1);
}

Er worden simpelweg drie lijnen getekend tussen de drie punten (x1,x2)(y1,y2)  en  (x3,y3). Met behulp van deze methode kunnen we op de volgende manier zelfs een volledig ingevulde driehoek tekenen:

// Een gekleurde driehoek gemaakt met 
// behulp van de methode driehoek
import java.applet.*;
import java.awt.*;
public class VulDriehoek extends Applet {
   public void paint (Graphics g) {
      g.setColor (Color.green);
      int  x1,  y1,  x2,  y2,  x3,  y3;
      // We beginnen met punt (160,120)
      x1 = x2 = x3 = 160;
      y1 = y2 = y3 = 120;
      for (int i=0; i<100; i++)  {
         driehoek  (g, x1, y1, x2, y2, x3, y3);
         y1--;  x2--;
         y2++; x3++; y3++;
     }
     g.setColor (Color.black);
     driehoek (g,x1,y1,x2,y2,x3,y3);
   }

   void driehoek (Graphics g, int x1, int y1,
          int x2, int y2, int x3, int y3)  {
      g.drawLine (x1, y1, x2, y2);
      g.drawLine (x2, y2, x3, y3);
      g.drawLine (x3, y3, x1, y1);}
   }
}

Hoe werkt deze applet?

Vanuit de methode paint wordt de methode driehoek diverse malen aangeroepen. We beginnen met een driehoekje waarvan alle coördinaten op het punt (160, 120) liggen, dus in feite één punt. Nu gaan we de coöördinaten (honderd maal) steeds verder uit elkaar leggen, dus we tekenen feitelijk steeds grotere groene driehoeken. Ten slotte tekenen we er een zwarte driehoek omheen, en ons resultaat ziet er zo uit:

Aan het begin van dit hoofdstuk werd opgemerkt dat elke methode bij een bepaalde klasse hoort. Maar bij welke klasse hoort de methode driehoek?

Je weet dat elke applet een klasse is. De methode driehoek wordt in deze applet gedefinieerd en hoort dus bij VulDriehoek.

   

een methode die een heel getal afgeeft

Als een applet een aantal goederen of een geboortejaar opvraagt, zou het handig zijn als je een methode hebt, die een positief heel getal uit een tekstvak kan halen.

Zo'n methode moet een aantal dingen doen, zoals:

  • een string uit het tekstvak kopiëren
  • de string omzetten in een getal
  • controleren of dit een positief heel getal is
  • de waarde afgeven aan het aanroepende programmadeel

De methode om dat te doen hoeft niet zo heel ingewikkeld te zijn. Hieronder zie je zo'n methode:

int haalIntUitVak (TextField tekstVak)  {
   int n = -1;
   String tmp = tekstVak.getText();
   try  {
      n = Integer.parseInt (tmp);
   } catch (NumberFormatException exc) { }
   return n;
}

   

Foutafhandeling

De methode parseInt() uit de klasse Integer zet een string om in een heel getal. Maar wat betekenen de woorden  try .. catch?

Dit is de manier waarop we in Java kunnen voorkomen dat een programma met een foutmelding stopt als er iets misgaat, of in dit geval: als er iets anders is ingetikt dan een heel getal.

We hadden afgesproken dat deze methode een positief heel getal moet afleveren. Deze methode maakt daar gebruik van en maakt het getal van tevoren negatief n = -1. Als er dan iets fout gaat, wordt er geen nieuwe waarde aan n toegekend en kunnen we door de negatieve waarde van n vaststellen dat er geen correct getal is ingetypt.

Tussen de accolades staat in ons voorbeeld niets. Maar we zouden eventueel tussen de accolades een actie kunnen opnemen, bijvoorbeeld zo:

catch (NumberFormatException exc) {fout = true;}
// fout is natuurlijk een boolean

Dat is in dit geval echter niet nodig omdat we door middel van een negatieve waarde al signaleren dat er iets fout gaat.

   

Opdracht 10.1

Schrijf een applet met twee tekstvakken, waarin positieve hele getallen kunnen worden ingevuld. Na klikken op een knop worden het (absolute) verschil, de som en het product van de twee getallen getoond. Haal de twee getallen uit het tekstvak met de hierboven getoonde methode. Signaleer ook als de getallen niet aan de voorwaarde voldoen.

   

(c) 2003-2008, Thomas J.H.Luif