Gå til innhold

[Løst] Får til å printe ut verdien direkte fra objektene, men ikke i for-each fra en ArrayList.


Anbefalte innlegg

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 av Gavekort
Lenke til kommentar
Videoannonse
Annonse

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 av Gavekort
Lenke til kommentar

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 av Gavekort
Lenke til kommentar

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 av Gavekort
Lenke til kommentar

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

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 av Gavekort
Lenke til kommentar

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 av Gavekort
Lenke til kommentar

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

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

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

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 av Gavekort
Lenke til kommentar

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...