Нөлдік көрсеткішті тастайды java-дегі ерекше жағдай

## Class B ##
    public class ClassB{

    public ClassB() {
    }

    public String getAddress() {
        return "Address";
    }
      }

## Class A ##
    public class ClassA{
    private ClassB classb;

    public ClassA() {
    }

    public void setClassb(ClassB classb) {
    this.classb = classb;
}
    public void getAddress() {
         System.out.println(classb.getAddress());
    }
      }

## Main Class ##
        public class MainClass{

    public static void main(String[] args){
        ClassA classa = new ClassA();
        classa.getAddress();
    }}


----------

Бұл бағдарламаны іске қосқан кезде, nullpointer ерекшелігін қайтарады. Біреу маған Nullpointer Exception себебін түсіндіруге бола ма? Рақмет сізге. Мен setter әдісін қолдануға тырыстым, бірақ әлі де nullpointer ерекшелігін тастаймын

3
classB нысанын жасамадыңыз. Сіз бұл жай ғана жарияладыңыз.
қосылды автор me_digvijay, көзі
Мен бұл сұрақты жабуды ұсынамын, себебі бұл сайттың кішкентай аудиториясына қызмет етуі мүмкін.
қосылды автор Mordechai, көзі

6 жауаптар

ClassA ішіндегі classB данасы орнатылмаған.

ClassA данасын жасаған кезде ClassB құрастыруға тура келеді

public class ClassA{
private ClassB classb;

public ClassA() {
    classb = new ClassB()
}

public void getAddress() {
     System.out.println(classb.getAddress());
}
}
1
қосылды

бұны:

    public class ClassA{
    private ClassB classb = new ClassB(); //initialize

    public ClassA() {
    }

    public void getAddress() {
         System.out.println(classb.getAddress());
    }
   }
1
қосылды

classb is declared in your ClassA, but it's not initialized, so when you try classb.getAddress(), you get a NullPointerException. You can initialize it in your constructor for ClassA:

 public ClassA() 
 {
    classb = new ClassB();
 }
1
қосылды

classb is just a reference variable which will point to a object. To get anything done from ClassB, you first need to create the object of the class as shown below

1-шешім:

//initialize at the time of declaration
private ClassB classb = new ClassB();

шешім 2:

//provide a setter method: 
private ClassB classb;
public void setClassb(ClassB classb)
{
     this.classb= classb;
}

EDIT:

сіздің негізгі сыныпта

осы мәлімдемелердің орнына:

    ClassA classa = new ClassA();
    classa.getAddress();

мына мәлімдемелерді қолданып көріңіз:

    ClassA classa = new ClassA();
    classa.setClassb(new ClassB());//new statement to be inserted!
    classa.getAddress();
1
қосылды
Бұл конструктор емес, баптау әдісі. Менің жаман. Мен кодты редакцияладым.
қосылды автор codeMan, көзі
@ gjman2 Мен өзімнің жауапымды редактордың параметрін қалай пайдалану керектігін көрсету үшін редакцияладым. Мынаны көр
қосылды автор codeMan, көзі
шешім 2://Setter әдісін қамтамасыз етеді: private ClassB classb; бұл конструктор немесе баптау әдісі? public setClassB (ClassB сыныбы) {this.classb = classb; }
қосылды автор gjman2, көзі
Сіздің шешіміңіз 2 конструктор немесе баптау әдісі болып табылады? Setter әдісі void дұрыс қайтару түріне ие болуы керек пе?
қосылды автор gjman2, көзі
бірақ пайдаланылған setter әдісін қолданып көрдім, бірақ ол әлі де nullpointer ерекшелігін шығарады
қосылды автор gjman2, көзі

ClassA ClassB инициализацияланған емес

жеке ClassB classb = жаңа ClassB ();

Take a look http://www.artima.com/designtechniques/initializationP.html

0
қосылды

Басқалар айтқандай, classb элементінің classa элементіне байланысты емес. Мұны түзету үшін ClassA нысанын инициализациялағанда немесе инициализациялауға болады, себебі сіз ClassB ның getAddress() әдісінен статикалық мәнді қайтаруыңыз керек, ClassB статистикасының getAddress() әдісін жасаңыз, ClassB нысанын инициализациялауды қиындатпаңыз, ClassA's getAddress() әдісін ClassA's getAddress() әдісінен статикалық түрде анықтамалық.

Мысал:

// Class B
public class ClassB
{
    public ClassB()
    {
    }

    public static String getAddress()
    {
        return "Address";
    }
}


// Class A
public class ClassA
{
    public ClassA()
    {
    }

    public void getAddress()
    {
        System.out.println(ClassB.getAddress());
    }
}


// Main Class
public class MainClass
{
    public static void main(String[] args)
    {
        ClassA classa = new ClassA();
        classa.getAddress();
    }
}
0
қосылды