我有一个Java NullPointerException问题。
例如: 我有三个班级A,B和C.
public class A
{
public void methodA1()
{ }
}
//////////////////////////////
public class B
{
private A a;
private C c;
public void methodB1()
{
a = c.methodC1;
}
public void methodB2()
{
a.methodA1();
}
}
/////////////////////////////
public class C
{
public A methodC1()
{
return new A();
}
}
正如您可以看到上面的代码,主要问题在于B类。我的问题是,如果B类中的字段a在methodB1中初始化,为什么我不能在methodB2中再次使用?编译器给我使用代码a.methodeA1()的NullPointerException。而且我不能再创建另一个新的a因为我需要methodB1()的结果,即methodB1()中的a。请帮忙。
答案 0 :(得分:4)
您创建了C
类的对象,但忘记将其分配给新对象
public class B
{
private A a;
private C c;
public void methodB1()
{
c = new C(); // Added
a = c.methodC1(); // the problem was here
}
public void methodB2()
{
a.methodA1();
}
}
您可能想了解NullPointerException。
在构造函数中,您必须首先调用methodB1()
,如下所示:
public B(){
this.methodB1();
this.methodB2();
}
public static void main(String...args){
new B();
}
由于避免了a
的 NullPointerException ,正如您在 methodB1 中看到的那样,您分配了一个新对象ot a
。
答案 1 :(得分:1)
无保证 methodB1()
在 methodB2()
之前将被称为 - 两者都是公共方法,任何其他类都可以使用{在methodB2()
初始化methodB1()
之前{1}}。
如果确实希望将这些方法保留为两种公共方法,那么确实不想初始化a
或a
除非调用你的一个B类方法。你可以试试这个:
c
除非public class B{
private A a;
private C c;
public void methodB1(){
if(c == null){
methodB3();
}
a = c.methodC1;
}
public void methodB2(){
if(a == null){
methodB1();
}
a.methodA1();
}
public void methodB3(){//Allows other classes to initialize c directly
c = new C(); //though 'c' is still private so can only be accessed
} //by methodB1()
}
和/或a
非常“昂贵”(即花费大量时间,系统资源等),否则通常会更容易确保你在声明变量时已经初始化了变量。
我建议阅读这篇关于如何初始化变量的好文章:http://www.artima.com/designtechniques/initializationP.html
答案 2 :(得分:0)
a= c.method1;
不会初始化它。你正在调用一个方法,代码应该是
c= new C();
a=c.method1();
答案 3 :(得分:-1)
我认为您在上面的代码中有一些拼写错误,正如Patashu建议的那样。
这就是B级的方式:
public class B
{
private A a;
private C c;
public static void main(String []a)
{
B b=new B();
b.methodB1();
b.methodB2();
}
public void methodB1()
{
c= new C();
a = c.methodC1();
System.out.println("Inside Method B1");
}
public void methodB2()
{
a.methodA1();
System.out.println("Inside Method B2");
}
}
////////////////////////////////////////// 这是A类:
public class A
{
public void methodA1()
{
System.out.println("This is class A");
}
}
这对我的JVM工作得很好......可能是JVM存在问题?不确定!但上面的代码工作得非常好。