Nullpointer при доступе к члену внешнего класса из внутреннего расширенного

417
06 февраля 2017, 15:31

Здравствуйте, имеется следующая конструкция:

class A{
    int x;
    A(){
        foo();
    }
    void foo(){}
}
class B{
    int x;
    class C extends A{
        C(){
            super();
        }
        @Override
        void foo(){
            x = B.this.x; //Nullpointer здесь
        }
    }
    C c;
    B(){
        c = new C();
    }
}

Пока что решил это, избавившись от зависимости C и A, просто переписав A в C. Но как-то не хотелось бы дублировать целый класс из-за этого.

Почему возникает ошибка и как исправить это другим способом, не дублируя класс?

P.S. если имеет значение, то это возникает в коде под андроид, но думаю и в обычной java тоже самое.

Ошибка оказалась в многопоточности, в одном потоке вышеприведенная структура работает без ошибок. Вот самый минимум кода, как просили:

MainActivity.java

package com.mycompany.StackDemo;
import android.app.Activity;
import android.os.Bundle;
import android.opengl.GLSurfaceView; 
public class MainActivity extends Activity{
    private GLSurfaceView glSurfaceView;
    Game room;
    Player p;
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        room = new Game();
        glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setRenderer(room);
        glSurfaceView.queueEvent(new Runnable() { public void run() {room.start();} });
    }
}

QuadObj.java

package com.mycompany.StackDemo;
public class QuadObj
{
    float x;
    QuadObj(float a){
        x = a;
        update();
    }
    void update(){}
}

Player.java

package com.mycompany.StackDemo;
public class Player
{
    final Part part[] = new Part[1];
    float x;
    Player(float a){
        x=a;
        part[0]=new Part(0);
    }
    class Part extends QuadObj{
        Part(float a){
            super(a);
        }
        @Override
        void update(){
            x=Player.this.x;
        }
    }
}

Game.java

package com.mycompany.StackDemo;
import android.opengl.GLSurfaceView;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class Game implements GLSurfaceView.Renderer
{
    Player p;
    public void start(){
        p=new Player(0);
    }
    public void onDrawFrame(GL10 glUnused){}
    public void onSurfaceChanged(GL10 glUnused, int widthc, int heightc){}
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config){}
}

Вот сам текст ошибки:

E/AndroidRuntime(23151): FATAL EXCEPTION: GLThread 836

E/AndroidRuntime(23151): java.lang.NullPointerException

E/AndroidRuntime(23151): at com.mycompany.StackDemo.Player$Part.update(Player.java:18)

E/AndroidRuntime(23151): at com.mycompany.StackDemo.QuadObj.(QuadObj.java:9)

E/AndroidRuntime(23151): at com.mycompany.StackDemo.Player$Part.(Player.java:13)

E/AndroidRuntime(23151): at com.mycompany.StackDemo.Player.(Player.java:8)

E/AndroidRuntime(23151): at com.mycompany.StackDemo.Game.start(Game.java:9)

E/AndroidRuntime(23151): at com.mycompany.StackDemo.MainActivity$100000000.run(MainActivity.java:18)

E/AndroidRuntime(23151): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1463)

E/AndroidRuntime(23151): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

READ ALSO
Uri.getPath(); возвращает вместо картинки /document/image/156

Uri.getPath(); возвращает вместо картинки /document/image/156

Помогите, а то ничего не поймуОжидаю, что путь должен быть /document/image/picture

431
как работает анимация в javafx

как работает анимация в javafx

пробовал понять читая статьи,не получилось!Прошу объяснить по простому на примере:есть StackPane с именем Mpane нужно увеличить его размер с допустим...

486
default методы в интерфейсе [дубликат]

default методы в интерфейсе [дубликат]

На данный вопрос уже ответили:

430