Pomoć oko zadatka iz Jave
Zadatak ne radi, rok se bliži, a poruka greške ne pomaže? Velika većina zaglavljenih Java zadataka pada na jednu od šest grešaka ispod. Prođi kroz listu: uz svaku ide primer koda koji puca, ispravka i način da problem sledeći put prepoznaš sam. Ako ni to ne reši stvar, na dnu je objašnjeno kako da nam pošalješ zadatak.
1. NullPointerException: objekat koji ne postoji
Najčešći izuzetak u studentskim zadacima. Znači da pozivaš metodu ili čitaš polje nad promenljivom koja ne pokazuje ni na jedan objekat, jer je deklarisana, ali nikad nije inicijalizovana:
String ime; // deklarisano, ali je null
System.out.println(ime.length()); // NullPointerExceptionIspravka je da objekat zaista napraviš (ili dodeliš vrednost) pre upotrebe:
String ime = "Ana";
System.out.println(ime.length()); // 3Kako naći uzrok: pogledaj stack trace od vrha. Prva linija koja pominje tvoju klasu sadrži i broj linije, npr. at Main.main(Main.java:12), što znači da je greška u 12. liniji fajla Main.java. Na toj liniji proveri svaku promenljivu levo od tačke: neka od njih je null. Čest slučaj su i nizovi objekata: new Student[5] pravi niz od 5 praznih (null) mesta, a svakog studenta moraš posebno da napraviš.
2. ArrayIndexOutOfBoundsException: petlja ide korak predaleko
Niz od n elemenata ima indekse od 0 do n−1. Klasična greška je uslov sa <= umesto <:
int[] niz = {10, 20, 30};
for (int i = 0; i <= niz.length; i++) { // puca kad i postane 3
System.out.println(niz[i]);
}for (int i = 0; i < niz.length; i++) { // ispravno: i ide 0, 1, 2
System.out.println(niz[i]);
}Kako prepoznaš: poruka greške kaže tačno koji indeks je tražen, npr. Index 3 out of bounds for length 3. Ako je traženi indeks jednak dužini niza, uslov petlje je gotovo sigurno krivac.
3. Poređenje stringova sa == umesto .equals()
Operator == poredi da li dve promenljive pokazuju na isti objekat u memoriji, a ne da li im je sadržaj isti. Sa kratkim literalima često „radi“ jer ih Java interno deli, pa greška prođe neopaženo, a onda pukne baš na odbrani, kad string stigne sa unosa:
Scanner sc = new Scanner(System.in);
String odgovor = sc.nextLine();
if (odgovor == "da") { // uvek false za unos sa tastature
System.out.println("Potvrđeno");
}if (odgovor.equals("da")) { // ispravno: poredi sadržaj
System.out.println("Potvrđeno");
}Kako prepoznaš: program se ne ruši, ali grana „nikad ne uđe“ iako uneseš tačno tu vrednost. Kad god if sa stringom ne radi bez očiglednog razloga, prvo proveri da li negde stoji ==.
4. Scanner preskače unos posle nextInt()
Metoda nextInt() pročita broj, ali u ulaznom baferu ostavi znak za novi red koji si uneo pritiskom na Enter. Sledeći nextLine() pokupi taj zaostali znak i vrati prazan string, pa izgleda kao da je program „preskočio“ pitanje:
int godine = sc.nextInt();
String ime = sc.nextLine(); // odmah vrati "", preskočenoint godine = sc.nextInt();
sc.nextLine(); // pokupi zaostali Enter
String ime = sc.nextLine(); // sada čeka pravi unosKako prepoznaš: program ne staje tamo gde očekuješ unos, ili string promenljiva ostane prazna. Rešenje je dodatni nextLine() posle svakog nextInt() ili nextDouble() iza kojeg sledi čitanje teksta.
5. Beskonačna petlja: uslov koji nikad ne postane netačan
Ako program „radi“ ali se nikad ne završava (ili konzola štampa unedogled), petlja se vrti u krug. Dva tipična uzroka: brojač se ne menja u telu petlje, ili se menja u pogrešnom smeru:
int i = 0;
while (i < 10) {
System.out.println(i); // i se nigde ne uvećava
}int i = 0;
while (i < 10) {
System.out.println(i);
i++; // uslov će postati netačan
}Kako prepoznaš: dodaj privremeni ispis vrednosti od kojih uslov zavisi na početak tela petlje. Ako se iz ispisa vidi da se vrednost ne menja, ili se menja ali uslov i dalje ostaje tačan, našao si mesto greške.
6. Kako pročitati poruku kompajlera
Poruke kompajlera deluju zastrašujuće, ali imaju uvek isti oblik: ime fajla, dvotačka, broj linije, opis greške:
Main.java:15: error: cannot find symbol
System.out.println(zbirr);
^
symbol: variable zbirrOvde je greška u fajlu Main.java, u 15. liniji, a strelica pokazuje tačno mesto. Poruka cannot find symbol znači da kompajler ne prepoznaje ime. Najčešće je u pitanju slovna greška u imenu promenljive (zbirr umesto zbir), promenljiva deklarisana u drugom bloku pa van dometa, ili zaboravljen import. Pravilo koje uvek važi: ispravlja se prva greška sa vrha, pa se prevodi ponovo, jer jedna prava greška ume da proizvede desetine lažnih ispod sebe.
Česta pitanja
Šta ako moj problem nije na listi?
Lista pokriva greške koje se najčešće ponavljaju, ali Java zadaci umeju da zapnu na sto načina, od rada sa fajlovima do JavaFX interfejsa. Pošalji tekst zadatka i poruku greške (ili opis šta se dešava umesto očekivanog), pa na času prolazimo kroz konkretan problem.
Koliko brzo dobijam odgovor?
Obično u roku od jednog radnog dana. Poruka mora da sadrži kompletan tekst zadatka i tačnu poruku greške; na nepotpune upite ne odgovaramo. U odgovoru stiže predlog termina za čas.
Da li radite ceo zadatak umesto mene?
Ne. Cilj časa je da zadatak rešiš ti, uz vođenje. Prolazimo kroz problem korak po korak: prvo lokalizujemo grešku, zatim objasnimo zašto nastaje, pa zajedno napišemo ispravku. Tako sledeći sličan zadatak rešavaš sam, što je i poenta ako te čeka ispit ili odbrana.
Koliko časova treba za jedan zadatak?
Zavisi od problema. Sitna greška tipa NullPointerException ili petlje koja ide predaleko ume da se reši već na jednom času, dok složeniji zadaci traže više termina. Koliko je časova realno potrebno, vidi se tek kad pogledamo zadatak.
Povezane stranice
Ako ti pored konkretnog zadatka treba i sistematičan rad na gradivu, pogledaj časove Java programiranja. Za veće obaveze (seminarske, projekte, aplikacije za predaju) postoji izrada projekata.
Zapeo si i posle ovoga?
Pošalji kompletan tekst zadatka i tačnu poruku greške preko kontakt forme. Javljamo se sa predlogom termina, a čas se zakazuje u kalendaru.