2017-04-20 232 views
0

我遵循了NullPointerException異常相關的鏈接,例如:空指針異常

How to solve java.lang.NullPointerException error?

What is a NullPointerException, and how do I fix it?

我得到了大部分從代碼整理出我的空指針異常,但我無法得到遵循空指針異常的原因。我運行在調試模式,並看到「sc.items.add(cd)」(Calculate.java的第9行);一片空白!任何人都可以解釋原因。

我正在實施訪問者模式。我正在計算不同項目的成本。一個項目是CD。下面是代碼:

ShoppingCart.java

import java.util.ArrayList; 

    public class ShoppingCart { 

    ArrayList<Visitable> items; 

    public double calculatePostage(){ 
     //Create a visitor 

     PostageVisitor visitor = new PostageVisitor(); 

    // iterate through all items 
      for(Visitable item: items){ 

      item.accept(visitor); 
     } 

     double postage = visitor.getTotalPostage(); 

     return postage; 

    } 
} 

Calculate.java

public class Calculate { 

     public static void main(String[] args) { 
      // TODO Auto-generated method stub 
     ShoppingCart sc = new ShoppingCart(); 

     CD cd = new CD(100); 
     sc.items.add(cd); 
     double postageInMain = sc.calculatePostage(); 
     System.out.println(postageInMain); 

     } 

} 

CD.java

public class CD implements Visitable { 

     private double price; 

     @Override 
     public void accept(Visitor visitor) { 
      // TODO Auto-generated method stub 

    } 
     public CD(double price){ 
      this.price = price; 
    }  
    double getPrice(){ 
      return price; 
    } 

} 

PostageVisitor.java

public class PostageVisitor implements Visitor { 
     private double totalPostageForCart; 



     public void visit (CD cd){ 

      totalPostageForCart += cd.getPrice(); 
     } 

    public void visit (DVD dvd){ 

     totalPostageForCart += dvd.getPrice(); 
    } 
    // return the internal state 
    public double getTotalPostage(){ 

     return totalPostageForCart; 

    } 

} 
ShoppingCart

Visitable.java

public interface Visitable { 
    public void accept(Visitor visitor); 
} 

Visitor.java

public interface Visitor { 
    public void visit(Book book); 


    public void visit(CD cd); 


} 
+2

的ArrayList 物品;未初始化.... – MGorgon

回答

0

items不與ArrayList對象初始化,這就是爲什麼你NPE。

import java.util.ArrayList; 

    public class ShoppingCart { 

    ArrayList<Visitable> items = new ArrayList<>(); // <---- this will solve the problem 

    public double calculatePostage(){ 
     //Create a visitor 

     PostageVisitor visitor = new PostageVisitor(); 

    // iterate through all items 
      for(Visitable item: items){ 

      item.accept(visitor); 
     } 

     double postage = visitor.getTotalPostage(); 

     return postage; 

    } 
} 

此外,我想提一提,你並不真正需要public修飾符在接口中的方法,它僅僅是多餘的。

0

ArrayList<Visitable> items;代碼更改ShoppingCart.java文件

ArrayList<Visitable> items; 
items = new ArrayList<>();