Gavekort Skrevet 19. april 2012 Del Skrevet 19. april 2012 (endret) Hei! Jeg prøver å lage en metode som summerer 'BigDecimal price'-verdien for hvert objekt i en ArrayList. Problemet er at jeg kan printe ut verdien for det konstruerte objektet, men om jeg skal hente det ut av arraylisten så får jeg en nullpointer med samme metoden. Class Order { private ArrayList<OrderItem> items = new ArrayList<OrderItem>(); public void addItem(Item item, int quantity){ OrderItem currentorderitem = new OrderItem(item, quantity); // Names the inserted OrderItem items.add(currentorderitem); // Adds the (inserted, then renamed) OrderItem to 'items'-ArrayList } // WHAT IS DONE IN #1 public void printeachTotal(){ for (OrderItem i : items){ // For each OrderItem System.out.println(i.getOrderItemTotal()); // Get total } } } Class OrderItem{ // WHAT IS DONE IN #2 public BigDecimal getOrderItemTotal() { BigDecimal quantitybd = new BigDecimal(quantity); total = price.multiply(quantitybd); return total; } } Class Test { //CONSTRUCTS Pizza what = new Pizza("margarita", new BigDecimal(15.0)); Pizza what2 = new Pizza("Cheesy", new BigDecimal(12.0)); OrderItem thisorderitem = new OrderItem(what,2); OrderItem thisorderitem2 = new OrderItem(what2,3); Order thisorder = new Order(); thisorder.addItem(thisorderitem, 2); thisorder.addItem(thisorderitem2, 2); //TEST thisorder.printeachtotal(); //#1 System.out.println(thisorderitem.getOrderItemTotal()); //#2 } //----------------------------------------------------------------------------- #1: Exception in thread "main" java.lang.NullPointerException at data.items.OrderItem.getOrderItemTotal(OrderItem.java:30) at data.Order.printeachTotal(Order.java:52) at data.Main.main(Main.java:42) #2: 30 Feilene kan dere lese i bunnen. Jeg kan gi dere mer av koden om det skal være nødvendig. Hvor for fungerer #2, men ikke #1? Takk for alle svar. Endret 19. april 2012 av Gavekort Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 (endret) Kan nevnes at foreach for 'description' fungerer fint. Class Test { //TEST thisorder.printeachDesciption(); //#3 } Class Order { public void printeachDesciption(){ for (OrderItem i : items){ System.out.println(i.getDescription()); } } } //---------OUTPUT----------- #3 margarita Cheesy Endret 19. april 2012 av Gavekort Lenke til kommentar
selux Skrevet 19. april 2012 Del Skrevet 19. april 2012 Jeg kan ta en rask titt hvis du linker til hele koden på pastebin eller noe. Om den ikke er for lang da? Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 (endret) Det kan du, men det er ikke noe ferdig kode, så den er ikke noe godt dokumentert eller skrevet enda. Test-klassen min ligger under Data &--#62; Main.java. JUnit eller gui.* brukes ikke, så ignorer det. Edit: Fjernet filen da den ikke er gjeldende lenger. Endret 19. april 2012 av Gavekort Lenke til kommentar
selux Skrevet 19. april 2012 Del Skrevet 19. april 2012 Problemet er jo at price peker på null. Noe som mest sannsynlig er fordi public OrderItem(Item item, int quantity); aldri blir kaldt. Var det til noen hjelp? Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 (endret) Tenker du på 'total = price.multiply(quantitybd);' i 'getOrderItemTotal()'? Hvorfor fungerer da 'thisorderitem.getOrderItemTotal()'? Forskjellen mellom 'thisorder.printeachtotal()' (aka #1) og 'thisorderitem.getOrderItemTotal()' (aka #2), er at førstnevnte gjør det samme som sistnevnte, bare rekursivt for hvert objekt jeg har lagt i en ArrayList. Jeg tenkte først at det måtte være noe feil med ArrayList, men hvordan klarer jeg da å printe ut 'desciption' rekursivt? Endret 19. april 2012 av Gavekort Lenke til kommentar
selux Skrevet 19. april 2012 Del Skrevet 19. april 2012 De gjør jo ikke det samme? public void printeachTotal() bruker metoden getOrderItemTotal() som bruker objektet price som er null. public void printeachDesciption() bruker metoden getDescription() som bare returner description. Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 (endret) Hva mener du er 'null'? Construtoren i OrderItem sender jo price jeg bestemmer til this.price. public OrderItem(Item item, int quantity) { description = item.getDescription(); price = item.getPrice(); //HER SETTES PRICE TIL ET BIGDECIMAL SOM JEG HAR SATT I Item item this.quantity = quantity; } //ORDERITEM-CLASS public BigDecimal getPrice() { return price; } //RETURNERER RIKTIG PRICE Price i Order brukes ikke, bare for å få ting klart. Endret 19. april 2012 av Gavekort Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 (endret) Nå har jeg fått printeachtTotal() til å fungere, men det er en debug-method, og jeg får ikke getSubtotal() til å fungere. //VIRKER public void printeachTotal(){ for (OrderItem i : items){ System.out.println(i.getOrderItemTotal()); } } //VIRKER IKKE public BigDecimal getSubtotal(){ for (OrderItem i : items){ subtotal.add(i.getOrderItemTotal()); } return subtotal; } System.out.println(thisorder.getSubtotal()); Gir: Exception in thread "main" java.lang.NullPointerException at data.Order.getSubtotal(Order.java:44) at data.Main.main(Main.java:47) Endret 19. april 2012 av Gavekort Lenke til kommentar
selux Skrevet 19. april 2012 Del Skrevet 19. april 2012 Ja, du bruker konstruktøren, men metoden som returnerer price er ikke implementert? Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 Så hvordan får jeg getSubtotal() til å fungere? package data; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import data.items.OrderItem; public class Order implements Item{ private Date date; private String customerName; private BigDecimal discount; private String receipt; private String description; private ArrayList<OrderItem> items = new ArrayList<OrderItem>(); private BigDecimal subtotal; public Order(){ } public BigDecimal getSubtotal(){ for (OrderItem i : items){ subtotal.add(i.getOrderItemTotal()); } return subtotal; } //DEBUG public void printeachTotal(){ for (OrderItem i : items){ System.out.println(i.getOrderItemTotal()); } } } Hvis jeg putter 'private BigDecimal subtotal = new BigDecimal(0);' i constructor så returnerer den '0'. Jeg er sikker på at jeg gjør en skikkelig tåpelig feil her, om at jeg ikke har initialisert 'subtotal' skikkelig eller noe. Lenke til kommentar
Sokkalf™ Skrevet 19. april 2012 Del Skrevet 19. april 2012 Så hvordan får jeg getSubtotal() til å fungere? <snip> Hvis jeg putter 'private BigDecimal subtotal = new BigDecimal(0);' i constructor så returnerer den '0'. Jeg er sikker på at jeg gjør en skikkelig tåpelig feil her, om at jeg ikke har initialisert 'subtotal' skikkelig eller noe. Du deklarerer jo subtotal utenfor konstruktøren, så det bør holde med en subtotal = new BigDecimal(0); i konstruktøren, altså bare en assignment. Når du deklarerer den på nytt i konstruktøren ender den jo opp som lokal variabel der, og da vil aldri objektet den refererer kunne nås fra de andre metodene, Lenke til kommentar
selux Skrevet 19. april 2012 Del Skrevet 19. april 2012 Som nevnt er problemet at når du bruker price har den verdien null, fordi metoden du bruker for å hente den ut ikke er implementert og bare returnerer null. class OrderItem{ (..) public BigDecimal getPrice() { // TODO Auto-generated method stub return null; } (..) } Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 (endret) Så hvordan får jeg getSubtotal() til å fungere? &--#60;snip&--#62; Hvis jeg putter 'private BigDecimal subtotal = new BigDecimal(0);' i constructor så returnerer den '0'. Jeg er sikker på at jeg gjør en skikkelig tåpelig feil her, om at jeg ikke har initialisert 'subtotal' skikkelig eller noe. Du deklarerer jo subtotal utenfor konstruktøren, så det bør holde med en subtotal = new BigDecimal(0); i konstruktøren, altså bare en assignment. Når du deklarerer den på nytt i konstruktøren ender den jo opp som lokal variabel der, og da vil aldri objektet den refererer kunne nås fra de andre metodene, Det resulterer i at jeg får ut resultatet '0', så hvorfor fungerer da ikke: subtotal.add(i.getOrderItemTotal()); i.getOrderItemTotal() gir meg først et BigDecimal(30) og så et BigDecimal(24) i for-each loopen, så i praksis så skal den først addere 30 til subtotal, og så skal den addere 24 til subtotal, noe som skal gi meg 54 når jeg kaller opp getSubtotal(). Man kan si at i.getOrderItemTotal() er et alias av f.eks BigDecimal(30) om alt fungerer skikkelig. public BigDecimal getSubtotal(){ for (OrderItem i : items){ subtotal.add(BigDecimal(30)); } return subtotal; } Som nevnt er problemet at når du bruker price har den verdien null, fordi metoden du bruker for å hente den ut ikke er implementert og bare returnerer null. Det er ikke reelt lenger. public BigDecimal getPrice() { // TODO Auto-generated method stub return price; } Price skal ikke være problemet, da denne methoden fungerer slik den skal: public void printeachTotal(){ for (OrderItem i : items){ System.out.println(i.getOrderItemTotal()); } } Endret 19. april 2012 av Gavekort Lenke til kommentar
Sokkalf™ Skrevet 19. april 2012 Del Skrevet 19. april 2012 Vel, uansett er dette en litt klønete måte å gjøre det på når jeg kikket en gang til. Du bør droppe global deklarering av subtotal, og gjøre det lokalt i metoden isteden. public BigDecimal getSubtotal(){ BigDecimal subtotal = new BigDecimal(0); for (OrderItem i : items){ subtotal.add(i.getOrderItemTotal()); } return subtotal; } Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 (endret) Takk! Men jeg får likevel kun ut '0' som vi deklarerte subtotal som. Edit: La ved en oppdatert versjon som du kan se på. Endret 19. april 2012 av Gavekort Lenke til kommentar
selux Skrevet 19. april 2012 Del Skrevet 19. april 2012 Problemet der er at du gjør aldri noe med verdien som add returnerer. Lenke til kommentar
Sokkalf™ Skrevet 19. april 2012 Del Skrevet 19. april 2012 Ah, bingo. Lenge siden jeg har vært borti BigDecimal. Må selvsagt gjøre noe sånt som "subtotal = subtotal.add(blabla..)" Lenke til kommentar
Gavekort Skrevet 19. april 2012 Forfatter Del Skrevet 19. april 2012 Jeg printer den ut i Main. Main vil printe ut hva den sier til thisorder, det er at thisorder skal summere getOrderItemTotal() for hvert OrderItem til et BigDecimal som heter subtotal, og gi tilbake subtotal. Dette resulterer at Main vil i teorien gjøre System.out.println(subtotal). Ah, bingo. Lenge siden jeg har vært borti BigDecimal. Må selvsagt gjøre noe sånt som "subtotal = subtotal.add(blabla..)" Har du sett! Det fungerte! Tusen takk alle sammen! Alle problemene er løst! 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å