icebyte Skrevet 23. juni 2006 Del Skrevet 23. juni 2006 (endret) Hei Jeg har et program som kompilerer fint, men når jeg kjører det og velger et valg fra en meny, så får jeg et "Nullpointerexception". Hvorfor oppstår et nullpointerexception og hvordan fikser enn dette? Det er tre nullpointerexception i koden nedenfor, kan noe hjelpe meg med dette problemet. Har søkt litt på nettet og fortstått det slik at "nullpointerexception" er at en har opprettet en objekt, men referansen peker ikke til noe konkret objekt. Får likevel problemer i koden her. Alle hjelp mottas med takk. public class ProgramStart { // Oppretter objekter Student nyStudent = new Student(); Professor nyProfessor = new Professor(); Kurs nyttKurs = new Kurs(); // Eksplisitt standardkonstruktør ProgramStart() { visMeny(); } // Starting the program public static void main(String[] args) { new ProgramStart(); } public void visMeny() { for ( int i = 0;;) { // Oppretter en ny instans av TastaturLeser for å kunne lese inn data TastaturLeser les = new TastaturLeser(); // Viser menyen for brukeren System.out.println("\n\nMENY\n"); System.out.println("1. Opprett en student"); System.out.println("2. Opprett en professor"); System.out.println("3. Opprett et kurs"); System.out.println("4. Skriv ut alle student"); System.out.println("5. Skriv ut alle professorer"); // System.out.println("6. Skriv ut alle kurs"); System.out.println("6. Avslutt\n\n"); System.out.print("Ditt valg[1,2,3,4]: "); int intValg = les.lesHeltall(); switch(intValg) { // Oppretter en ny student ved første valg case 1: nyStudent.opprettStudent(); break; // Oppretter en ny professor ved andre valg case 2: nyProfessor.opprettProfessor(); break; // Oppretter et nytt kurs ved tredje valg case 3: nyttKurs.opprettKurs(); break; // Skriv ut alle studenter case 4: nyStudent.skriveUtStudenter(); break; // Skrive ut alle professorer case 5: nyProfessor.skrivUtProfessorer(); break; // Skriver ut alle kurs // case 6: Kurs nKurs = new Kurs(); nyttKurs.skrivUtKurs(); break; // Avslutter programmet ved fjerde valg case 6: System.out.println("Avslutter"); break; // Dersom det er ikke er oppgitt et valg som er i menyen gis det ut en melding om dette default: System.out.println("Ugyldig valg."); } } } Endret 23. juni 2006 av icebyte Lenke til kommentar
threiran Skrevet 23. juni 2006 Del Skrevet 23. juni 2006 La meg tippe... Ett sted i koden din du ikke har delt med oss, står noe ala følgende: Student nyStudent; (Linjen sier at nyStudent er en referanse til en Student.) men ingen(?) steder i koden din står: nyStudent = new Student(); (Linjen gir nyStudent ny spesiell student å referere til.) eller noe i den stilen. NullpointerException får du hvis du skriver nyStudent.opprettStudent() før du har fortalt java hvilken Student du skal jobbe med. Hvis opprettStudent er en static metode bør du i steden for benytte Student.opprettStudent(); CPL Lenke til kommentar
icebyte Skrevet 23. juni 2006 Forfatter Del Skrevet 23. juni 2006 (endret) Den øverste koden var ikke med, så redigerte den første posten med den komplette koden for den første klassen kalt "ProgramStart". Kan ikke se at det bare er deklarert en referanse til feks. et Student objekt, alle objekter skal være opprettet med "new" operatoren. Nedenfor vises koden for student klassen for at du eller andre kan få en bedre idè over hvordan dette problemet kan fikses: public class Student extends Person { // Oppretter informasjon spesielt for en student String studieRetning; boolean semesterAvgift; // Oppretter en tabell av student-objekter Student[] studentOversikt = new Student[100]; Student() { } // Oppretter en eksplisitt standardkonstruktør for å opprette en enkelt student Student(String fornavn, String etternavn, int alder, String adresse, String retning, boolean savgift) { // Lagrer informasjon om en enkelt student this.strFornavn = fornavn; this.strEtternavn = etternavn; this.intAlder = alder; this.strAdresse = adresse; this.studieRetning = retning; this.semesterAvgift = savgift; } // Metode for oppretting av en student public void opprettStudent() { int i = 0; for (; i < studentOversikt.length; i++) { Student nyStudent = new Student("Fornavn", "Etternavn", 22, "Veien 21", "Informatikk", true); studentOversikt[i] = nyStudent; System.out.println("Ny student opprettet."); break; } } // Skriver ut alle registrerte studenter public void skriveUtStudenter() { System.out.println("\n\nAlle studenter: \n\n"); int i = 0; // Skriver ut alle studenter for (; i < studentOversikt.length; i++ ) { System.out.println("Fornavn: " + studentOversikt[i].strFornavn + " " + "Etternavn: " + studentOversikt[i].strEtternavn + " " + "Alder: " + studentOversikt[i].intAlder); System.out.println("Adresse: " + studentOversikt[i].strAdresse + " " + "Studieretning: " + studentOversikt[i].studieRetning + " "); System.out.println("Betalt semesteravgift: " + studentOversikt[i].semesterAvgift + "\n"); } } } Endret 23. juni 2006 av icebyte Lenke til kommentar
CruellaDeVille Skrevet 23. juni 2006 Del Skrevet 23. juni 2006 Den øverste koden var ikke med, så redigerte den første posten med den komplette koden for den første klassen kalt "ProgramStart". Kan ikke se at det bare er deklarert en referanse til feks. et Student objekt, alle objekter skal være opprettet med "new" operatoren. Nedenfor vises koden for student klassen for at du eller andre kan få en bedre idè over hvordan dette problemet kan fikses: public class Student extends Person { // Oppretter informasjon spesielt for en student String studieRetning; boolean semesterAvgift; // Oppretter en tabell av student-objekter Student[] studentOversikt = new Student[100]; Student() { } // Oppretter en eksplisitt standardkonstruktør for å opprette en enkelt student Student(String fornavn, String etternavn, int alder, String adresse, String retning, boolean savgift) { // Lagrer informasjon om en enkelt student this.strFornavn = fornavn; this.strEtternavn = etternavn; this.intAlder = alder; this.strAdresse = adresse; this.studieRetning = retning; this.semesterAvgift = savgift; } // Metode for oppretting av en student public void opprettStudent() { int i = 0; for (; i < studentOversikt.length; i++) { Student nyStudent = new Student("Fornavn", "Etternavn", 22, "Veien 21", "Informatikk", true); studentOversikt[i] = nyStudent; System.out.println("Ny student opprettet."); break; } } // Skriver ut alle registrerte studenter public void skriveUtStudenter() { System.out.println("\n\nAlle studenter: \n\n"); int i = 0; // Skriver ut alle studenter for (; i < studentOversikt.length; i++ ) { System.out.println("Fornavn: " + studentOversikt[i].strFornavn + " " + "Etternavn: " + studentOversikt[i].strEtternavn + " " + "Alder: " + studentOversikt[i].intAlder); System.out.println("Adresse: " + studentOversikt[i].strAdresse + " " + "Studieretning: " + studentOversikt[i].studieRetning + " "); System.out.println("Betalt semesteravgift: " + studentOversikt[i].semesterAvgift + "\n"); } } } 6370090[/snapback] Hadde vært fint hvis du skrev ut hvor feilmeldingen kommer... men hvis jeg skal tippe vilt vil jeg gjette meg til her: skriveUtStudenter() Du sier at i metoden opprettStudent() at du skal opprette en informatikkstudent og avbryte. Deretter sier du i skrivUtStudenter at den skal loope gjennom tabell av studenter i studentoversikt.length ganger. Først oppretter du EN student, legger den i tabell på index 0. Deretter forsøker du å skrive ut studenten, men i tillegg også studenten på 1, 2, 3.... 99 .... og de finnes ikke. Hvis det er der du får dine nullpointere er alternativet å lage en teller for tabellen, og loope i <antall> ganger. Og sjekke for tom/full tabell når du skal lese/legge til objekter. En annen ting.. som gjør ting litt lettere for deg. I metoden skrivUtStudenter sier du at du skal skrive ut studentOversikt.strFornavn. Istedet kan du si at Student stud = studentOversikt.. og deretter referere til stu.strFornavn.. Litt mindre å skrive, litt lettere å se hva som egentlig skjer. Sånn litt off topic. Kanskje en egen klasse for studentregisteret istedet for å ha det i student? Lenke til kommentar
icebyte Skrevet 23. juni 2006 Forfatter Del Skrevet 23. juni 2006 Takk for svar. Jeg skjønner nå at for-løkken skriver ut elementer i tabellen som har verdien "null" helt opp til hundre, det er ikke meningen. Det som er ment er at den skal skrive ut kun de studenter som er registrert. Når for-løkken prøver å skrive ut et element i tabellen som da er tomt, så blir vel det er "Nullpointerexception". Så, hvor går jeg herfra. Hvordan får jeg da laget en tabell av en brukerdefinert datatype og skrevet ut alle elementer? Må jeg bruke en liste da eller kan jeg bruke en tabell fortsatt ? Lenke til kommentar
_Xorcist Skrevet 24. juni 2006 Del Skrevet 24. juni 2006 Du kan unngå nullpointers inni for-løkka med en enkel if-test: if(studentOversikt[i] != null) { System.out.println ... } Jeg vil også anbefale deg å implementere toString() på Student-objektet ditt. Da blir det enklere å skrive ut all informasjonen om en student. Lenke til kommentar
CruellaDeVille Skrevet 24. juni 2006 Del Skrevet 24. juni 2006 Takk for svar. Jeg skjønner nå at for-løkken skriver ut elementer i tabellen som har verdien "null" helt opp til hundre, det er ikke meningen. Det som er ment er at den skal skrive ut kun de studenter som er registrert. Når for-løkken prøver å skrive ut et element i tabellen som da er tomt, så blir vel det er "Nullpointerexception". Så, hvor går jeg herfra. Hvordan får jeg da laget en tabell av en brukerdefinert datatype og skrevet ut alle elementer? Må jeg bruke en liste da eller kan jeg bruke en tabell fortsatt ? 6371341[/snapback] Hvis du har tenkt at opprettStudent skal opprette hundre studenter er det ikke noe problem å gjøre det slik du gjør, men bare fjern "break" i forløkken din. Hvis du skal opprette en og en student i opprettStudent fjerner du forløkken og lager en metode som legger en student til i studentOversikt[antall]. Når du skal skal skrive ut studentoversikt looper du fra 0 til antall. Jeg ville delt det, laget en klasse for student og en for studenter... ((((Og kanskje, hvis du har anledning brukt en annen datastruktur enn arrays for å lagre de)))) Lenke til kommentar
CruellaDeVille Skrevet 24. juni 2006 Del Skrevet 24. juni 2006 Takk for svar. Jeg skjønner nå at for-løkken skriver ut elementer i tabellen som har verdien "null" helt opp til hundre, det er ikke meningen. Det som er ment er at den skal skrive ut kun de studenter som er registrert. Når for-løkken prøver å skrive ut et element i tabellen som da er tomt, så blir vel det er "Nullpointerexception". Så, hvor går jeg herfra. Hvordan får jeg da laget en tabell av en brukerdefinert datatype og skrevet ut alle elementer? Må jeg bruke en liste da eller kan jeg bruke en tabell fortsatt ? 6371341[/snapback] Du kan bruke en datastruktur du syns er fin og hensiktsmessig og alt etter hvilke operasjoner du skal utføre på dataene. Hvis du på forhånd vet at du aldri skal ha mer enn 100 studenter i listen din er array greitt. Hvis du vet at en student som er lagt til i listen aldri skal slettes er array greitt, hvis ikke ville jeg feks gått for ArrayList. Jeg har laget en ny versjon for deg, fikk testet helt til jeg laget programStartklassen. Da manglet jeg Tastaturleser, professor og kurs-klassene dine. Men ideen skal være gyldig. jeg har skilt ut studentregisteret i egen klasse. Jeg forstår ikke helt hva personklassen din gjør, siden du aldri kaller på super. Jeg har iallfall laget en personklasse som jeg oppfatter som helt okay, så kan du sammenligne med din og se om de ligner. Jeg har også fjernet eksplisitt standardkonstruktør for student, siden du ikke trenger den lenger. (jeg antar at den var for å få tilgang til "leggtil og skrivut"metodene for listen. http://norskwebforum.no/pastebin/2543 Lenke til kommentar
icebyte Skrevet 28. juni 2006 Forfatter Del Skrevet 28. juni 2006 Takk for svar. Jeg skjønner nå at for-løkken skriver ut elementer i tabellen som har verdien "null" helt opp til hundre, det er ikke meningen. Det som er ment er at den skal skrive ut kun de studenter som er registrert. Når for-løkken prøver å skrive ut et element i tabellen som da er tomt, så blir vel det er "Nullpointerexception". Så, hvor går jeg herfra. Hvordan får jeg da laget en tabell av en brukerdefinert datatype og skrevet ut alle elementer? Må jeg bruke en liste da eller kan jeg bruke en tabell fortsatt ? 6371341[/snapback] Hvis du har tenkt at opprettStudent skal opprette hundre studenter er det ikke noe problem å gjøre det slik du gjør, men bare fjern "break" i forløkken din. Hvis du skal opprette en og en student i opprettStudent fjerner du forløkken og lager en metode som legger en student til i studentOversikt[antall]. Når du skal skal skrive ut studentoversikt looper du fra 0 til antall. Jeg ville delt det, laget en klasse for student og en for studenter... ((((Og kanskje, hvis du har anledning brukt en annen datastruktur enn arrays for å lagre de)))) 6372299[/snapback] Jeg skal dele det opp mer og bruke lister i stedet for arrays. Saken er at jeg er ikke god på å bruke lister enda hehe, men skal lese om det og gjøre noen tester med det så går det nok uten noe store problemer Lenke til kommentar
icebyte Skrevet 28. juni 2006 Forfatter Del Skrevet 28. juni 2006 Takk for svar. Jeg skjønner nå at for-løkken skriver ut elementer i tabellen som har verdien "null" helt opp til hundre, det er ikke meningen. Det som er ment er at den skal skrive ut kun de studenter som er registrert. Når for-løkken prøver å skrive ut et element i tabellen som da er tomt, så blir vel det er "Nullpointerexception". Så, hvor går jeg herfra. Hvordan får jeg da laget en tabell av en brukerdefinert datatype og skrevet ut alle elementer? Må jeg bruke en liste da eller kan jeg bruke en tabell fortsatt ? 6371341[/snapback] Du kan bruke en datastruktur du syns er fin og hensiktsmessig og alt etter hvilke operasjoner du skal utføre på dataene. Hvis du på forhånd vet at du aldri skal ha mer enn 100 studenter i listen din er array greitt. Hvis du vet at en student som er lagt til i listen aldri skal slettes er array greitt, hvis ikke ville jeg feks gått for ArrayList. Jeg har laget en ny versjon for deg, fikk testet helt til jeg laget programStartklassen. Da manglet jeg Tastaturleser, professor og kurs-klassene dine. Men ideen skal være gyldig. jeg har skilt ut studentregisteret i egen klasse. Jeg forstår ikke helt hva personklassen din gjør, siden du aldri kaller på super. Jeg har iallfall laget en personklasse som jeg oppfatter som helt okay, så kan du sammenligne med din og se om de ligner. Jeg har også fjernet eksplisitt standardkonstruktør for student, siden du ikke trenger den lenger. (jeg antar at den var for å få tilgang til "leggtil og skrivut"metodene for listen. http://norskwebforum.no/pastebin/2543 6372335[/snapback] Takk for ny versjon av koden. Dette programmet var egentlig ment bare som et test program for å kunne drive med arrays, arv, subklasser etc. bedre så koden er nok ikke den beste. Jeg kalte aldri på super ettersom jeg ikke helt hadde skjønt meningen med super annet enn at jeg viste at den refererte til superklassens standardkonstruktør. Jeg vet nå hvordan jeg skal bruke super og kommer til å gjøre det videre. En sak når det gjelder den nye koden du har laget er at klassen "Person" kan bli laget en instans av. Den kan naturligvis være slik, men her skal vel den egentlig være abstrakt ettersom du oppnår ingenting av å opprette et Person objekt. Det kan jo være en student, professor oll. Deretter er det bedre at student og professor er vanlig public og arver fra den abstrakte klassen "Person". Å bruke "protected" på medlemsvariabler skal jeg begynne å gjøre mer og det samme med private. Skal se på koden litt mer nøye og se hva annet jeg kan lære av den Lenke til kommentar
CruellaDeVille Skrevet 29. juni 2006 Del Skrevet 29. juni 2006 En sak når det gjelder den nye koden du har laget er at klassen "Person" kan bli laget en instans av. Den kan naturligvis være slik, men her skal vel den egentlig være abstrakt ettersom du oppnår ingenting av å opprette et Person objekt. Det kan jo være en student, professor oll. Deretter er det bedre at student og professor er vanlig public og arver fra den abstrakte klassen "Person". Å bruke "protected" på medlemsvariabler skal jeg begynne å gjøre mer og det samme med private. Skal se på koden litt mer nøye og se hva annet jeg kan lære av den 6402559[/snapback] En klasse skal holde orden på dataene sine selv i størst mulig grad, og ha strengest mulig innkapsling av data. Public er tilgjengelig utenfra klassen, private kun inad i klassen, men protected er tilgjengelig for subklasser av klassen. Hvis du hadde gjort navn og adresse (osv) private i Person ville ikke Student få tilgang til de - derfor protected. Lenke til kommentar
icebyte Skrevet 29. juni 2006 Forfatter Del Skrevet 29. juni 2006 (endret) En sak når det gjelder den nye koden du har laget er at klassen "Person" kan bli laget en instans av. Den kan naturligvis være slik, men her skal vel den egentlig være abstrakt ettersom du oppnår ingenting av å opprette et Person objekt. Det kan jo være en student, professor oll. Deretter er det bedre at student og professor er vanlig public og arver fra den abstrakte klassen "Person". Å bruke "protected" på medlemsvariabler skal jeg begynne å gjøre mer og det samme med private. Skal se på koden litt mer nøye og se hva annet jeg kan lære av den 6402559[/snapback] En klasse skal holde orden på dataene sine selv i størst mulig grad, og ha strengest mulig innkapsling av data. Public er tilgjengelig utenfra klassen, private kun inad i klassen, men protected er tilgjengelig for subklasser av klassen. Hvis du hadde gjort navn og adresse (osv) private i Person ville ikke Student få tilgang til de - derfor protected. 6404400[/snapback] Hei Jeg kjenner godt til aksessmodifikatorene, men aldri tenkt noe særlig over å bruke disse på variabler. Har bare fokusert på akessmodifikatorer på klasser og metoder m.a.o. Fint med repetisjon da Endret 29. juni 2006 av icebyte Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå