Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: java, error ykinkertaisessa ohjelmassa

tkok [16.11.2008 13:56:46]

#

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;


}
}

Antti Laaksonen [16.11.2008 14:07:51]

#

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.

Metabolix [16.11.2008 14:08:25]

#

Aloitat haun liian ylhäältä, indeksi luvut.length ei enää kuulu taulukkoon.

ville-v [16.11.2008 14:17:27]

#

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.

tkok [16.11.2008 14:57:38]

#

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.

ville-v [16.11.2008 15:02:51]

#

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ä.

Pekka Karjalainen [16.11.2008 15:10:47]

#

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ää.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta