Реализация заводского шаблона и получение исключения NullPointerException, не могу понять, может ли кто-нибудь помочь мне исправить

#nullpointerexception #factory-pattern

#исключение nullpointerexception #заводской шаблон

Вопрос:

Я публикую этот код, в котором я реализовал фабричный метод, код успешно скомпилирован, но во время выполнения возникает исключение нулевого указателя, и я не могу это понять, я знаю, когда ссылка на объект указывает на ничто, тогда возникает это исключение, но в моем случае я не могу понять, может кто-нибудь предложитья исправляю здесь, я публикую код.

 import java.util.Scanner;
abstract class Plan
{
 protected double rate;

public abstract void getRate();

public void calculateBill(int totalUnitsConsume)
{
    System.out.println(totalUnitsConsume*rate);
}

}   


  class DomesticPlan extends Plan
  {
   public void getRate()
   {
    rate=3.5;
    }
  }

 class CommercialPlan extends Plan
 {
public void getRate()
 {
 rate=7.50;
 }

 }

class InstitutionalPlan extends Plan
 {
 public void getRate()
 {
  rate=5.50;
  }

  }

 class PlanFactory
 {
  public static Plan getPlan(String planType)
  {
  if(planType==null)
 {
  return null;
  }

   if (planType.equalsIgnoreCase("DOMESTIC PLAN"))
  {
   return new DomesticPlan();
  }
   else if(planType.equalsIgnoreCase("COMMERCIAL PLAN"))   
    { 
     return new CommercialPlan();
      }
       else if (planType.equalsIgnoreCase("INSTITUTION PLAN"))
        {
        return new InstitutionalPlan();
          }



     return null;

    }
    }


    public class ElectricityBill
    {
       public static void main(String ... qwe)
     {

     int choice;
    System.out.println("Choose The Plan type");
    System.out.println("1.Domestic Plan");
    System.out.println("2.Commercial Plan");
    System.out.println("3.Institution Plan");

    Scanner sc=new Scanner(System.in);

    choice=sc.nextInt();
    if(choice>3)
    {
      System.out.println("Wrong choice entered");
    }
    else
    {
     System.out.println("You chose Plan no.:"  choice);
    }
     switch(choice)
    {
    case 1 : Plan p=PlanFactory.getPlan("DomesticPlan");
             p.getRate();
             p.calculateBill(100);  
             break;

   case 2 : Plan p2=PlanFactory.getPlan("CommercialPlan");
            p2.getRate(); 
            p2.calculateBill(300);
            break;

   case 3 : Plan p3=PlanFactory.getPlan("InstitutionalPlan");
            p3.getRate();  
            p3.calculateBill(250); 
            break;
  default : System.out.println("May be you entered wrong choice");
       }



       }
       }
 Output

 I:Data>java ElectricityBill
 Choose The Plan type
 1.Domestic Plan
 2.Commercial Plan
 3.Institution Plan
 1
 You chose Plan no.:1
 Exception in thread "main" java.lang.NullPointerException
    at ElectricityBill.main(ElectricityBill.java:96)
 

Комментарии:

1. Поместите System.out.println() где вы return null; , чтобы вы могли видеть, как это происходит.

2. ты прав, Эрик, мой блок If не выполняется if(planType==null) { System.out.println(«If Block»); возвращает null; }

3. Можете ли вы предложить исправление для этого

Ответ №1:

 51. planType.equalsIgnoreCase("DOMESTIC PLAN")
...
96. PlanFactory.getPlan("DomesticPlan")
 

Здесь ни один из if...else блоков не выполняется, поэтому возвращается getPlan null .

Пожалуйста, измените "DomesticPlan" на "DOMESTIC PLAN" в строке 96

Ответ №2:

Вы пропустили пробел внутри «Внутренний план in your code, so your factory can not match any string and returns null, just correct it to внутреннего плана`

Комментарии:

1. Я благодарю вас всех за то, что предложили мне лучшее решение Я реализовал ваши решения одно за другим, но все же мой код выдает исключение NullPointer, есть ли какие-либо другие проблемы в коде

2. Спасибо всем вам .. Моя проблема решена, я снова внес предложенные изменения и «сохранить как», и вот как работают внесенные изменения

Ответ №3:

Это потому, что ваша фабрика не возвращает план в этом случае. Вы делаете PlanFactory.getPlan("DomesticPlan") (нет места в DomesticPlan), но в вашем методе getPlan вы ищете «ВНУТРЕННИЙ ПЛАН» (с пробелом) и, следовательно Plan p , имеет значение null. Исключение выдается сразу после того, как вы вызываете getRate метод в нулевом плане.

Вы должны проверять значение null при получении значения с завода, например if (p != null) { p.getRate(); ... }