Tälläistä erroria antaa:
[Session started at 2008-11-16 13:52:20 +0200.]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at Indeksi.alkionIndeksi(Indeksi.java:30)
at Indeksi.main(Indeksi.java:18)
java has exited with status 1.
Koodi:
// import java.util.*; public class Indeksi { /** * Testaa metodin alkionIndeksi() toimintaa. */ public static void main(String[] args) { int alkio = 3; //haettavan alkion arvo. Testaa eri arvoilla! int[] luvut = {2, 2, 3, 4, 5, 1}; System.out.println(alkionIndeksi(luvut, alkio)); } /** * Palauttaa haettavan luvun ensimmäisen esiintymän * indeksin taulukossa luvut. * * Alkuehto: luvut != null && alkioTaulukossa(luvut, haettava) */ public static int alkionIndeksi(int[] luvut, int haettava) { int ekapaikka = 0; for(int i=luvut.length; i>=0; i=i-1){ if (luvut[i] == haettava){ekapaikka = i;} } return ekapaikka; } }
Jos taulukossa on kuusi alkiota, niiden indeksit ovat 0, 1, 2, 3, 4 ja 5.
Aloita siis silmukka indeksistä luvut.length-1 eikä luvut.length.
Jos muutat silmukan toisinpäin, voit palauttaa ensimmäisen löytyneen indeksin.
Aloitat haun liian ylhäältä, indeksi luvut.length ei enää kuulu taulukkoon.
Jos teet näin päin, säästät aikaa, koska ekapaikka:an sijoitetaan aina vain kerran:
for(int i = 0; i < luvut.length; i++){ if (luvut[i] == haettava){ ekapaikka = i; break; } }
Huomaa break: Se keskeyttää silmukan heti kun ensimmäinen osuma on löydetty.
Toinen ongelma seuraavassa tehtävässä:
main funkkarin 3 ekaa riviä:
public static void main(String[] args) { int alku = Integer.parseInt(args[0]); int loppu = Integer.parseInt(args[1]);
Eikös se tuossa luo pari int muuttujaa ja hae annetusta args taulukosta sisältöä? no käänsin debuggerilla niin rivillä kaksi args taulukko oli tyhjä ja suoritus loppui toisen rivin jälkeen erroriin:
[Session started at 2008-11-16 14:30:21 +0200.]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Luvut.main(Luvut.java:15)
java has exited with status 1.
Mistä tuon argsin pitäisi tulla ja mitä pitää sisällään?
kyse on siis valmiiksi puolin tehdystä ohjelmasta opettajan toimesta. Prujussa ei ollu mitään fiksua ja opettaja vain kuittasi viime tunnit sillä että ei meidän tarvitse tietää tai että ei jaksa selittää :F.
Argsin pitäisi tulla käyttöjärjestelmältä ja sisältää ohjelmalle annetut parametrit. Jos niitä ei ole, ei taulukolle ole varattu muistia. Tarkista taulukon koko ennen kuin yrität käsitellä sitä.
Jos ajat ohjelmasi komentoriviltä, niin mikäli kirjoitat jotain seuraavantapaista
java Ohjelma 500 600 700
löydät args-taulukosta merkkijonot "500", "600" ja "700". Jos taas käytät IDEä, on sen asetuksissa keino asettaa komentoriviargumentit (command line arguments mahdollisesti enkuksi) ohjelman suoritusta varten.
Tässä yksinkertainen Java-ohjelma, jolla voit testata args-taulukon sisältöä. Käyttämäni silmukaa on ns. for-each silmukka, jos sitä ei ole vielä kurssilla käsitelty.
class Testi { public static void main(String args[]) { for (String s: args) { System.out.println(s); } } }
Komentoriviargumentit siis erotellaan toisistana välilyönnillä. Niiden määrän näkee tutkimalla args-taulukon length-kenttää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.