【问题标题】:Null Pointer exception in Java ( implementing visitor pattern)Java中的空指针异常(实现访问者模式)
【发布时间】:2026-02-20 20:55:02
【问题描述】:

我已经关注了 nullpointerexception 的相关链接,例如:

How to solve java.lang.NullPointerException error?

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

我的大部分空指针异常都是从代码中整理出来的,但我无法得到以下空指针异常的原因。

 Exception in thread "main" java.lang.NullPointerException
      at Calculate.main(Calculate.java:9)

我在调试模式下运行并看到“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;

     }
 }

计算.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;

    }

 }

Visitable.java

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

访问者.java

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


    public void visit(CD cd);


}

【问题讨论】:

  • ArrayList 项;未初始化....

标签: java nullpointerexception


【解决方案1】:

ShoppingCart 类中的字段 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 修饰符,这只是多余的。

【讨论】:

    【解决方案2】:

    将您的 ShoppingCart.java 文件 ArrayList&lt;Visitable&gt; items; 代码更改为

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

    【讨论】: