Permalänk
Medlem

NULL mitt i raketen? [java]

Har ett problem när programmet ska rita ut en raket så står det NULL i det den ritar ut. Har suttit och kämpat men hittar inte vad som blir fel. Annars fungerar allt som det ska.

import javax.swing.*; public class Rita { public static void main (String[] arg) { int fortsätta = 0; do{ Methods m1 = new Methods(); String [] val = {"Raket", "Flicka", "Pojke", "Avbryt"}; int svar = JOptionPane.showOptionDialog (null, "Gör ditt val!", "", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, val, val [2]); if (svar == 0){ String indata = JOptionPane.showInputDialog(null, "Hur många steg vill du att raketen ska ha?"); int antal = Integer.parseInt (indata); //Kan jag skicka "antal" som argument till "draw_step"? //Eller tänker jag helt tokigt här? m1.draw_base(); m1.draw_cone(); m1.draw_parallel(); m1.draw_step(antal); System.out.println (m1.draw_rocket()); } if (svar == 1){ m1.draw_head(); m1.draw_cone(); m1.draw_base(); System.out.println (m1.draw_girl()); } if (svar == 2){ m1.draw_head(); m1.draw_base(); m1.draw_parallel(); m1.draw_cone(); System.out.println (m1.draw_boy()); } if (svar == 3){ JOptionPane.showMessageDialog (null, "Tack för att du använt mitt program!"); System.exit (0); } fortsätta = JOptionPane.showConfirmDialog (null, "Vill du köra programmet igen?", "Igen?", JOptionPane.YES_NO_OPTION); }while (fortsätta == 0); if (fortsätta != 0);{ JOptionPane.showMessageDialog (null, "Tack för att du använt mitt program!"); System.exit (0); } } }

public class Methods { String head, cone, parallel, base, step, rocket, girl, boy; public void draw_head() { head = " //\\" + "\n" + "|o,o|" + "\n" + " \\v/" +"\n"; } public void draw_cone() { cone = " /\\" + "\n" + " / \\" + "\n" + "/ \\" + "\n"; } public void draw_parallel() { parallel = "| |" + "\n" + "| |" + "\n" + "| |" + "\n"; } public void draw_base() { base = "=======" + "\n"; } public void draw_step(int steps) { for (int a = 1; a <= steps; a = a + 1) step = step + parallel + base; } public String draw_rocket() { rocket = cone + base + step + cone; return rocket; } public String draw_girl() { girl = head + cone + base + cone; return girl; } public String draw_boy() { boy = head + base + parallel + base + cone; return boy; } }

Vart blir det fel?
Tacksam!

Permalänk
Medlem

Några tankar..
Funktionerna i klassen "Methods" ser väldigt underliga ut. Istället för att anropa draw_head(), draw_body() osv så föreslår jag att dessa variabler redan vid initiering av klassen är satta, föreslagsvis med static-nyckelordet så att dessa variabler delas mellan alla instanser av klassen.

public class Methods { private static String head = "..."; private static String base = "..."; private static String body = "..."; // och så vidare }

När du anropar slutfunktionerna som draw_girl() och draw_rocket() så returnera bara de delar som behövs. Det är helt onödigt att spara denna variabel i objektet eftersom de ändå genereras om vid varje anrop, och dessutom aldrig används internt av klassen. Med andra ord, skippa rocket = cone + base + head + ...-biten och returnera delarna direkt, alternativt skapa en lokal variabel i metoden och returnera denna.

Så till din fråga :P.. får du NULL för alla figurer eller bara för raketen?

edit: Ok, nu läste jag vad du faktiskt skrev. Så här är det: NULL-et kommer ur draw_step()-funktionen. När du i loopen kör step = step + ... så är objektvariabel step inte ännu initierad, vilket innebär att den är NULL. Eftersom step = NULL är step + vadsomhelst det samma som NULL + vadsomhelst.

edit 2: tog bort missvisande och felaktig information..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

I draw_step vad är variabeln step första gången i for-loopen??
Svaret är null och det är just därför det skrivs ut.

I övrigt är din kod riktigt dålig, metoderna har dåliga namn och dina strängar som innehåller "grafiken" kan implementeras bättre. Varför inte låta metoderna returnera String exempelvis.

Edit: Sen som vanligt..

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Medlem

Det är möjligt att koden är dålig och krånglig men den fungerar. Förutom att NULL skrivs ut. Jag är nybörjare på Java så istället för att klanka ner på koden så kan ni kanske komma med konkreta tips. Tack till er som faktiskt kommer med bra förslag och feedback. Alla kan inte vara stjärnor på Java.

Permalänk
Medlem
Skrivet av Teknocide:

Några tankar..
Funktionerna i klassen "Methods" ser väldigt underliga ut. Istället för att anropa draw_head(), draw_body() osv så föreslår jag att dessa variabler redan vid initiering av klassen är satta, föreslagsvis med static-nyckelordet så att dessa variabler delas mellan alla instanser av klassen.

public class Methods { private static String head = "..."; private static String base = "..."; private static String body = "..."; // och så vidare }

När du anropar slutfunktionerna som draw_girl() och draw_rocket() så returnera bara de delar som behövs. Det är helt onödigt att spara denna variabel i objektet eftersom de ändå genereras om vid varje anrop, och dessutom aldrig används internt av klassen. Med andra ord, skippa rocket = cone + base + head + ...-biten och returnera delarna direkt, alternativt skapa en lokal variabel i metoden och returnera denna.

Så till din fråga :P.. får du NULL för alla figurer eller bara för raketen?

edit: Ok, nu läste jag vad du faktiskt skrev. Så här är det: NULL-et kommer ur draw_step()-funktionen. När du i loopen kör step = step + ... så är objektvariabel step inte ännu initierad, vilket innebär att den är NULL. Eftersom step = NULL är step + vadsomhelst det samma som NULL + vadsomhelst.

edit 2: tog bort missvisande och felaktig information..

Tack! Men var ska jag initiera step så att det inte blir NULL?

Permalänk
Medlem

Antingen innan loopen eller direkt vid deklarationen.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av nadja:

Tack! Men var ska jag initiera step så att det inte blir NULL?

Gör som Teknocide sa och initiera dina variabler när du deklarerar dem

Edit: Tekno hann före