当我运行它时显示此错误

时间:2014-06-17 11:41:55

标签: java

当我运行它时显示此错误 线程" main"中的例外情况Abstract2.main上的java.lang.NullPointerException(Abstract2.java:70) 请告诉我如何解决它

我的代码在下面给出

import java.util.*;
abstract class plan
{
public double rate,bill;
public abstract void getrate();
public void cbill(int unit)
{
double bill=rate*unit;
System.out.println("bill is="+bill);
}
}
class domestic extends plan
{
public void getrate()
{
rate=2.5;
}
}
class commercial extends plan
{
public void getrate()
{
rate=5.5;
}
}
class industrial extends plan
{
public void getrate()
{
rate=7.5;
}
}
class bill
{
public plan getplan(String plantype)
{
if(plantype==("domestic"))
{
return new domestic();
}
if(plantype==("commercial"))
{
return new commercial();
}
if (plantype==("industrial"))
{
return new industrial();
}
return null;
}
}
class Abstract2
{
public static void main(String aa[])
{
plan p;//instance of class plan
String plantype;
int unit;
double rate;
bill b=new bill();
Scanner sc=new Scanner(System.in);
System.out.println("enter the plan type=");
System.out.println("     domestic");
System.out.println("     commercial");
System.out.println("     industrial");
plantype=sc.next();
System.out.println("enter the units");
unit=sc.nextInt();
p=b.getplan(plantype);
p.getrate();//line 70
p.cbill(unit);
}

}

请告诉我如何解决它

3 个答案:

答案 0 :(得分:2)

您的代码存在问题:

  • 违反了Java命名约定,例如类名应该大写..
  • getter / setter也违反了惯例。你的getrate()无效?得到什么呢?
  • 将字符串与==进行比较,应为equals
  • p=b.getplan(plantype);您的getplan(plantype)方法可能会返回null。下一行(line 70)您没有检查它(p),只是p.getrate();潜在的NPE。
  • String plantype未初始化。

答案 1 :(得分:0)

将方法更改为

public plan getplan(String plantype)
{
if(plantype.equals("domestic"))
{
return new domestic();
}
if(plantype.equals("commercial"))
{
return new commercial();
}
if (plantype.equals("industrial"))
{
return new industrial();
}
return null;
}
}

答案 2 :(得分:0)

除了Kent所说的一切之外,你问题的直接答案是你从未初始化植物类型,只是声明它。 getplan()方法中的逻辑可以防止它获取值。因此,它没有具体的价值。

还有一些需要注意的事项:

  1. 你真的应该学会缩进/分隔你的代码。不得不花几分钟时间将其标记出去,这样我就可以轻松阅读。通过类似的功能将事物分组成部分(即将所有变量声明放在一起,将所有System.out.println放在一起等)。
  2. 使您的变量名更具描述性。除非你找到它创建的行,否则p不会解释它是什么。
  3. get ...()命名函数通常返回一个值。这应该被命名为其他东西。