Permalänk

Nullpointerexception.

Tjena!

När jag kompilerar min java-klass så stöter jag på patrull. Problemet härstammar från metoden public String Blanda().
Vad jag kan förstå så behöver jag ha ett return-värde. Någon som har erfarenhet av problemet eller har någon idé hur jag kan lösa det?
Tack på förhand!

import java.util.ArrayList; import java.util.Collections; import java.util.List; import static java.util.Collections.shuffle; public class Kortlek { private List<?> deck; public void Spelkort() { String[] Hearts = {"2\u2665", "3\u2665", "4\u2665", "5\u2665", "6\u2665", "7\u2665", "8\u2665", "9\u2665", "10\u2665", "J\u2665", "Q\u2665", "K\u2665", "A\u2665"}; String[] Spades = {"2\u2660", "3\u2660", "4\u2660", "5\u2660", "6\u2660", "7\u2660", "8\u2660", "9\u2660", "10\u2660", "J\u2660", "Q\u2660", "K\u2660", "A\u2660"}; String[] Clubs = {"2\u2663", "3\u2663", "4\u2663", "5\u2663", "6\u2663", "7\u2663", "8\u2663", "9\u2663", "10\u2663", "J\u2663", "Q\u2663", "K\u2663", "A\u2663"}; String[] Diamonds = {"2\u2666", "3\u2666", "4\u2666", "5\u2666", "6\u2666", "7\u2666", "8\u2666", "9\u2666", "10\u2666", "J\u2666", "Q\u2666", "K\u2666", "A\u2666"}; ArrayList<String> deck = new ArrayList<>(); Collections.addAll(deck, Hearts); Collections.addAll(deck, Spades); Collections.addAll(deck, Diamonds); Collections.addAll(deck, Clubs); } public String Blanda() { shuffle(deck); } public void Skriv() { System.out.println(deck); } }

Permalänk
Medlem

Det är exakt som du säger. I metoden Blanda() behöver du returnera en string eftersom du har skrivit metoden på det sättet.

public String Blanda()

Som du ser så står det String innan ditt metodnamn och det är vad som metoden förväntar sig returnera.

Permalänk
Medlem

Eller byt ut String mot void om den inte behöver returnera något.

Permalänk

Tack för att ni försöker förklara. Jag förstår tyvärr ändå inte hur jag ska skriva så att return faktiskt ger ett värde. Det kan nog vara så att jag har missat något, som jag får försöka läsa mig till, alternativt skriva klasserna på annat sätt.

Permalänk
Medlem

@trumanshow: Vill du att Blanda faktiskt ska returnera något värde? I så fall vad?

Permalänk
Medlem

@trumanshow:

Du kan t.ex. skriva return "minsträng" i slutet av funktionen. Då returnerar funktionen strängen "minsträng".

Lägger du till det i slutet av din blanda() metod så skulle man också kunna göra följande

a = Blanda() //Gör allt i blanda metoden. Blanda returnerar strängen "minsträng" som tilldelas till variablen a.

Däremot måste du ifrågasätta om blanda behöver skicka tillbaka någon sträng alls. Vanliga returvärden för metoder brukar vara ett resultat som är beroende på inparametern (tänk Y= F(x) i matematikens värld, Y-värdet beror på inparametern x).
Du kan även tänka dig att funktionen returnerar ett värde för status. 0 om funktionen gått igenom utan fel, något annat värde om det blivit fel.

Tänk som om metoderna var verb för verkligheten. Om du *blandar* en kortlek, behöver veta något efter att du blandat kortleken, troligtvis inte (datatypen void) ?
Eller om du t.ex. kastar tärning, troligtvis vill du ju veta vad tärningen landat på. Då vill du returnera datatypen int (heltal).

Permalänk
Medlem

AV det jag kan läsa så verkar det som om den inte borde returnera något värde, dvs borde vara en void.

public void Blanda() { shuffle(deck); }

Sen skulle jag även rekommendera:

  1. inte skriva på svenska dels för att i arbetslivet är detta något som sällan sker ( i min erfarenhet) samt att om du behöver hjälp/dela kod etc med en icke-svensktalande blir det väldigt knepigt väldigt fort!

  2. Metodnamn bör inte ha stor första bokstav, detta är något du vill ha för klasser men inte dess metoder

Permalänk

@Harddrive:
@Ellumination:

När jag läser vad du skriver så inser jag att jag har tänkt helt tokigt. Mitt problem ligger nog inte i själva klassen, utan när jag ska använda den i mitt program.

Det är egentligen när jag anropar metoden blanda() i main som jag får värdet null. Själva tanken med programmet är att jag ska skapa en ny kortlek. Sedan ska jag ha en metod som blandar kortleken och sist en funktion som skriver ut det första kortet.

Har jag tänkt helt fel när det gäller synlighet i mitt program?

Permalänk
Medlem
Skrivet av trumanshow:

Det är egentligen när jag anropar metoden blanda() i main som jag får värdet null. Själva tanken med programmet är att jag ska skapa en ny kortlek. Sedan ska jag ha en metod som blandar kortleken och sist en funktion som skriver ut det första kortet.

Har jag tänkt helt fel när det gäller synlighet i mitt program?

Ja, du har två deck-variabler, en som instansvariabel i klassen och en som lokal variabel i metoden Spelkort. När Spelkort anropas så skapar du en ny deck, fyller den med kort, och sen slängs den bort när metoden kört klart eftersom det bara är en lokal variabel. deck som du använder i Blanda är instansvariabeln du deklarerat längst upp i klassen, och den är ju alltid null eftersom du aldrig initierar den.

Sen är Spelkort-metoden väldigt underlig, den borde nog egentligen heta Kortlek. Läs på om hur konstruktorer fungerar.

Permalänk

@perost:

Nu har jag läst på ytterligare om instansvariabler och konstruktor. Ser det här ut att vara på rätt väg?

public class Kortlek { private String[] hearts; private String[] spades; private String[] clubs; private String[] diamonds; private Kortlek(String[] h, String[] s, String[] c, String[] d) { String[] Hearts = {"2\u2665", "3\u2665", "4\u2665", "5\u2665", "6\u2665", "7\u2665", "8\u2665", "9\u2665", "10\u2665", "J\u2665", "Q\u2665", "K\u2665", "A\u2665"}; String[] Spades = {"2\u2660", "3\u2660", "4\u2660", "5\u2660", "6\u2660", "7\u2660", "8\u2660", "9\u2660", "10\u2660", "J\u2660", "Q\u2660", "K\u2660", "A\u2660"}; String[] Clubs = {"2\u2663", "3\u2663", "4\u2663", "5\u2663", "6\u2663", "7\u2663", "8\u2663", "9\u2663", "10\u2663", "J\u2663", "Q\u2663", "K\u2663", "A\u2663"}; String[] Diamonds = {"2\u2666", "3\u2666", "4\u2666", "5\u2666", "6\u2666", "7\u2666", "8\u2666", "9\u2666", "10\u2666", "J\u2666", "Q\u2666", "K\u2666", "A\u2666"}; ArrayList<String> deck = new ArrayList<>(); Collections.addAll(deck, Hearts); Collections.addAll(deck, Spades); Collections.addAll(deck, Diamonds); Collections.addAll(deck, Clubs); } }

Går det att initera ett nytt objekt från en klass som inte ligger i main?

Permalänk
Medlem
Skrivet av trumanshow:

Nu har jag läst på ytterligare om instansvariabler och konstruktor. Ser det här ut att vara på rätt väg?

Nja, inte riktigt. Nu har du istället fyra instansvariabler som du inte använder och som därmed är null. Du har även en massa argument till konstruktorn som du inte använder någonstans, och deck som du skapar i kontruktorn är fortfarande en lokal variabel som försvinner så fort konstruktorn kört klart.

Skrivet av trumanshow:

Går det att initera ett nytt objekt från en klass som inte ligger i main?

Jag förstår tyvärr inte vad du menar, kan du ge något exempel?

Permalänk

@perost:

Hur hade du angett instansvariabler och konstruktor för att lösa problemet?
För tillfället så inser jag att jag inte har någon som helst aning eller hittar svaret nånstans, kanske är det så att jag helt enkelt inte förstår bättre. Har försökt "backtracka" i boken Java steg för steg hela dagen för att försöka förstå problemet samt hitta en lösning. Men nu känner jag mig uppgiven.

Permalänk
Medlem

@trumanshow: Jag vet inte om jag har missat det när jag kikade igenom tråden lite snabbt, men vad är ditt mål? Vad vill du utföra?

Permalänk

@L.Forsgren:

Tanken är att jag ska skapa en klass som skapar en kortlek. Utöver det så ska jag skapa två metoder, en som blandar kortleken och en som drar det översta kortet. De här metoderna ska sedan köras i main. Det stora problemet är att jag inte förstår hur metoden kortlek ska kunna sparas ner till en lista så att jag sedan ska kunna skapa ett nytt objekt av typen kortlek.