wiki:JavanAnsoja
Last modified 7 years ago Last modified on 2010-09-03 11:44:01

Pages linking to JavanAnsoja:
yleisiahtvirheita
s2010

Tyypillisiä Javan ansoja

Osa alla luetelluista ansoista on myös muissa kielissä (mm. C/C++).

1. Lukujen virheet

1.1 Kokonaislukujen jakolaskun tulos on kokonaisluku

  • jakolaskun tulos on kokonaisluku
    int n = 5/3;  => n==1;
    

1.2 Reaalilukujne pyöristysvirheet

  • vain kohden potensseilla lausuttavat luvut ovat tarkkkoja
    float f = 0.1;  // Ei ole tarkka ja monta kertaa summattuna ei tuota tasalukua!
    double d = 0.1; // vähän tarkempi, mutta edelleenkään ei tarkka!
    
  • kokonaisluvut mantissan arvoalueella ovat tarkkoja

2. List<Integer> listassa kaksi removea

Esim.
  List<Integer> lista ...

  lista.remove(23)

Tuossa ei tapahdukkaan 23:en automaattinen muunnos
Integer-luokkaan (AutoBoxin) koska removeja löytyy
kaksi kappaletta

 1) Integer remove(int index)
 2) boolean remove(Integer alkio)

ja kun 23 on int, käytetään mieluummin tuota 1) versiota
joka siis poistaa tietyssä indeksissä olevan alkion.
Olisi ollut parempi nimetä tuo eka vaikka removeFrom() tms...

Jos haluaa nimenomaan poistaa alkion, jonka arvona on 23,
pitää tässä tapauksessa käyttää muotoa:

  lista.remove(new Integer(23));

tai jos tuota 23 tarvitaan useammin, niin vaikka avuksi
apumuuttuja

  Integer alkioOliona = new Integer(23);
  ...
  lista.remove(alkioOliona);

3. Turhia olioiden luonteja

3.1 Liikaa String-olioita

  • esimerkiksi
       String jono = "";
       for (String sana:sanat) 
          jono += sana;  // Syntyy uusi String olio joka kierroksella
       return jono;
       
     "oikea tapa tehdä:"
    
       StringBuilder jono = new StringBuilder();
       for (String sana:sanat) 
          jono.append(sana);  // Uutta oliota ei synny
       return jono.toString();
    
    

4. Taulukot

4.1 Taulukkojen indeksit alkavat nollasta

  • muista että taulukkojen indkesit alkavat nollasta
  • taulukon viimeinen indeksi on taulukon pituus-1
  • taulukona alkiot alutetaan nolliksi
    int kuukausienPituudet = new int[12];
    // kuukausienPituudet[1] == 0;  tämä on totta koska alkiot alustuvat 0:ksi
    kuukausienPituudet[0] = 31;  // Tammikuu
    ...
    kuukausienPituudet[11] = 30;  // Tammikuu
    
    
  • taulukon läpikäynti indeksillä (huomaa <-merkki):
    summa = 0;
    for (int i=0; i<kuukausienPituudet.length; i++)
      summa += kuukausienPituudet[i];
    
  • taulukon läpikäynti uudella for-silmukalla:
    summa = 0;
    for (int pituus:kuukausienPituudet)
      summa += pituus;
    
  • huomaa että edellä pituus on tilapäinen muuttuja ja sille sijoittaminen ei muuta vastaavaa taulukon arvoa!