#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(); ... }