Ошибка on a null object reference

Закрыто
Батька Андройд
Сообщения: 8
Зарегистрирован: 20 авг 2015, 10:17

Ошибка on a null object reference

Сообщение Батька Андройд » 28 авг 2015, 11:11

Здравствуйте. 2 раза сталкивался со следующей ошибкой при запуске приложения: Attempt to write to field (далее путь к объекту) on a null object reference. В действии может быть не обязательно запись (Write), первый раз было Attempt invoke virtual method... Главное вторая часть (on a null object reference) ссылка на какой-то нулевой объект. В первый раз помогло создание нового проекта и просто копирование кода из старого в новый, ничего не меня и все заработало. Сейчас это не помогает. В интернете есть много тем с такой же проблемой на английском. Почитал, но мне так и не помогло. Сам перепробовал все что мог. Может ли кто-нибудь объяснить что это за on a null object reference и как с ним бороться???

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: Ошибка on a null object reference

Сообщение An-droid » 28 авг 2015, 11:24

Что-то разрушается, пока вы делаете трудоёмкую задачу. Может Активность убивается?
Изображение

Батька Андройд
Сообщения: 8
Зарегистрирован: 20 авг 2015, 10:17

Re: Ошибка on a null object reference

Сообщение Батька Андройд » 28 авг 2015, 11:43

An-droid писал(а):Что-то разрушается, пока вы делаете трудоёмкую задачу. Может Активность убивается?
Сам этот проблемный объект известен, это переменная типа float в одном из классов, в этом же классе есть метод, который присваивает этой переменной значение. В main классе я вызываю этот метод передаю ему на вход значение и вот тут и вылазит эта ошибка. Выполнение программы прекращается как только она доходит до этого метода. Как только я начинаю производить какие-нибудь действия с этой проблемной переменной так все не работает. Если закомментировать любые действия с этой переменной, то все работает. Переменная объявленна, почему она является этим нулевым объектом из-за которого не запускается приложение, я не могу понять.

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: Ошибка on a null object reference

Сообщение An-droid » 28 авг 2015, 11:44

Код бы глянуть.
Изображение

Батька Андройд
Сообщения: 8
Зарегистрирован: 20 авг 2015, 10:17

Re: Ошибка on a null object reference

Сообщение Батька Андройд » 28 авг 2015, 11:52

An-droid писал(а):Код бы глянуть.

Код: Выделить всё

package ru.p01startandroid.p02figure;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Path.Direction;
import android.view.View;
import android.util.AttributeSet;


public class PathView extends View {

    private Shape shape;
    public float ratioRadius;

    public PathView(Context context) {
        super(context);
        init();
    }

    public PathView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PathView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void init(){
        shape = new Shape();
    }


    public void onDraw(Canvas canvas) {
        canvas.drawARGB(80, 102, 204, 255);

        int width = getWidth();
        int height = getHeight();

        if (width == 0 || height == 0) {
            return;
        }
        float x = (float) width / 2.0f;
        float y = (float) height / 2.0f;
        float radius;
        if (width > height) {
            radius = height * ratioRadius;
        } else {
            radius = width * ratioRadius;
        }

        shape.setCircle(x, y, radius, Direction.CW);
        canvas.drawPath(shape.getPath(), shape.getPaint());
    }

    public void setShapeRatioRadius(float ratio) {
      ratioRadius = ratio;
    }
}

Проблемная переменная ratioRadius

класс Main

Код: Выделить всё

public class MainActivity extends Activity implements SeekBar.OnSeekBarChangeListener {

    private PathView pathView;
    private SeekBar seekBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        seekBar = (SeekBar) findViewById(R.id.seekBar);
        pathView = new PathView(this);
        //pathView = (PathView)findViewById(R.id.pathView);
        float defaultRatio = (float) (seekBar.getProgress()) / (float) (seekBar.getMax());
        pathView.setShapeRatioRadius(defaultRatio);
    }


    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        float defaultRatio = (float) (seekBar.getProgress()) / (float) (seekBar.getMax());
       /* pathView.setShapeRatioRadius(defaultRatio);
        pathView.invalidate();*/
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
}

В принципе решил проблему другими путями.

Аватара пользователя
An-droid
Сообщения: 51
Зарегистрирован: 25 авг 2015, 10:54

Re: Ошибка on a null object reference

Сообщение An-droid » 28 авг 2015, 12:06

Тут либо проблема с тем, что не отправляется контекст, и тогда в строке
pathView = new PathView(this); нужно вместо this написать getApplicationContext()

либо где то переменная используется, например при построении фигуры shape = new Shape() и тогда
нужно инициализировать ratioRadius сразу в конструкторе, при создании объекта, тем более что значение уже известно.
вместо

Код: Выделить всё

pathView = new PathView(this); 
float defaultRatio = (float) (seekBar.getProgress()) / (float) (seekBar.getMax()); 
сделать

Код: Выделить всё

float defaultRatio = (float) (seekBar.getProgress()) / (float) (seekBar.getMax());
pathView = new PathView(this, defaultRatio); 
Возможно :)
Изображение

Батька Андройд
Сообщения: 8
Зарегистрирован: 20 авг 2015, 10:17

Re: Ошибка on a null object reference

Сообщение Батька Андройд » 28 авг 2015, 12:37

И в правду проблема с конструктором new Path(this). Почему-то не работает с ним. Буду разбираться с ним. Спасибо за помощь, а то я уже 2-ой день сижу в код смотрю, который должен работать=)

Закрыто