PDA

Просмотр полной версии : Ошибка 1009


mAK08
10.06.2013, 00:39
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at MC_M()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
Как ее можно обойти? Вроде все исправил но это осталось...

-De-
10.06.2013, 00:47
Не дёргать методы и поля обьекта, который null. Научиться отлаживать, в дебаггере скорее всего конкретную строку бы увидели и вопрос бы не встал. Без кода короче ничего больше не скажешь, но тут эта ошибка обычно от того, что stage у DisplayObject null, пока этот обьект на сцену не добавили.

mAK08
10.06.2013, 01:13
package
{

import flash.events.MouseEvent;
import com.greensock.*;
import com.greensock.easing.*;
import flash.events.Event;
import flash.display.MovieClip;
import flash.geom.Rectangle;
import flash.media.Sound;
import flash.display.Sprite;
import flash.media.SoundTransform;


public class MC_M extends MovieClip
{
private var vol:Number;
private var drag_start:Boolean = false;
private var percent:Number = seek1.seekk.width;
private var currentPosition:Number = 0;
private var playingStatus:Boolean = true;
private var rev:Boolean = false;
private var forw:Boolean = false;
private var astep:Number = 3;
private var player_volume:Number = 100;


public function MC_M()
{
vol = 10;
slider_mc.mc.x = 100;
reviewB.addEventListener(MouseEvent.MOUSE_DOWN,reviewDOWN);
reviewB.addEventListener(MouseEvent.MOUSE_UP,reviewUP);
forward.addEventListener(MouseEvent.MOUSE_DOWN,forwardDOWN);
forward.addEventListener(MouseEvent.MOUSE_UP,forwardUP);
stopB.addEventListener(MouseEvent.CLICK,stopBB);
pauseB.addEventListener(MouseEvent.CLICK, pauseBB);
playB.addEventListener(MouseEvent.CLICK,playBB);
seek1.scrub.addEventListener(MouseEvent.MOUSE_DOWN,onPressS);
seek1.scrub.addEventListener(MouseEvent.MOUSE_UP,onReleaseS);
seek1.scrub.addEventListener(MouseEvent.RELEASE_OUTSIDE,onReleaseS);
slider_mc.mc.addEventListener(MouseEvent.MOUSE_DOWN, dragSlider);
slider_mc.mc.stage.addEventListener(MouseEvent.MOUSE_UP, stopSlider);

ifdrag();
this.soundTransform = new SoundTransform(3.3);
stop();


}

private function reviewDOWN(e:MouseEvent):void
{
rev = true;
reviewB.addEventListener(Event.ENTER_FRAME,reviewEnterFrame);
}
private function reviewEnterFrame(e:MouseEvent):void
{
if (rev)
{
currentPosition = this.currentFrame;
if (playingStatus)
{
this.gotoAndPlay(currentPosition - astep);
}
else
{
this.gotoAndStop(currentPosition - astep);
}
}
}


private function reviewUP(e:MouseEvent):void
{
rev = false;
}


private function forwardDOWN(e:MouseEvent):void
{
forw = true;
forward.addEventListener(Event.ENTER_FRAME,forwardEnterFrame);
}

private function forwardEnterFrame(e:MouseEvent):void
{
if (forw)
{
currentPosition = this.currentFrame;
if (playingStatus)
{
this.gotoAndPlay(currentPosition + astep);
}
else
{
this.gotoAndStop(currentPosition + astep);
}
}
}


private function forwardUP(e:MouseEvent):void
{
forw = false;
}




private function stopBB(e:MouseEvent):void
{
playingStatus = false;
this.stop();
currentPosition = 1;
this.gotoAndStop(currentPosition);

}



private function pauseBB(e:MouseEvent):void
{
playingStatus = false;
currentPosition = this.currentFrame;
this.stop();

}



private function playBB(e:MouseEvent):void
{
playingStatus = true;
this.gotoAndPlay(currentPosition);

}

private function ifdrag():void
{
if (! drag_start)
{
seek1.scrub.addEventListener(Event.ENTER_FRAME,SC);


function SC(e:Event):void
{
seek1.scrub.x = seek1.seekk.x + (this.currentFrame/this.totalFrames)*percent;
}

}
}




private function onPressS(e:MouseEvent):void
{
this.stop();
drag_start = true;
seek1.scrub.startDrag(false,new Rectangle(0,0,500,0));
seek1.scrub.removeEventListener(Event.ENTER_FRAME,SC);


}
function SC(e:Event):void
{
seek1.scrub.x = seek1.seekk.x + (this.currentFrame/this.totalFrames)*percent;
}



private function onReleaseS(e:MouseEvent):void
{
drag_start = true;
this.stop();
currentPosition = Math.floor((seek1.scrub.x/percent)*this.totalFrames);
if (playingStatus)
{
this.gotoAndPlay(currentPosition);
playingStatus = true;
}
else
{
this.gotoAndStop(currentPosition);
playingStatus = false;
}
seek1.scrub.stopDrag();


seek1.scrub.addEventListener(Event.ENTER_FRAME,SC);

}



private function dragSlider(event:MouseEvent):void
{
slider_mc.mc.startDrag(false,new Rectangle(0,0,100,0));
slider_mc.mc.removeEventListener(MouseEvent.CLICK, dragSlider);
slider_mc.mc.addEventListener(Event.ENTER_FRAME, changeVolume);
}

private function stopSlider(event:MouseEvent):void
{
slider_mc.mc.stopDrag();
slider_mc.mc.removeEventListener(MouseEvent.MOUSE_UP, stopSlider);
}

private function changeVolume(event:Event):void
{
vol = Math.round(slider_mc.mc.x) / 30;
this.soundTransform = new SoundTransform(vol);
}

}

}

искал, не нашел... А строку не показывает, только ошибку в выводе... Все добавлено у всех имена проставлены... Не знаю даже

Добавлено через 2 минуты
Как можно найти какой именно обьект null?

-De-
10.06.2013, 01:40
В дебаге запустить. И пошагово пройти этот конструктор (если упадёт не заходя, то seek1.seekk.width узнать не смогло, т.е. seek1 null или seek1.seekk). Если MC_M - не Document class, то явно slider_mc.mc.stage - это null, про что написал.

mAK08
10.06.2013, 02:01
Да правильно вы сказали это из за seekk который лежит в seek1. А как можно обратиться из класса к нему ?? я только начал в классах просто в кадре писал все получалось...

Ёлочка
10.06.2013, 02:08
У вас ошибка в строке private var percent:Number = seek1.seekk.width; Обращаться к seek1.seekk нужно в конструкторе. seek1.seekk не существует до того момента, пока не создан главный класс.

iNils
10.06.2013, 02:12
mAK08, в AS не принято использовать символ _ в качестве разделителя в названии переменных и функциях, нужно использовать camelCase. Используют только в наименовании констант, так как они пишутся в верхнем регистре.

Также, _ используется перед определением приватных переменных.
Таким образом, запись
private var player_volume:Number = 100;
Должна выглядеть так
private var _playerVolume:Number = 100;

AlexCooper
10.06.2013, 10:18
Ёлочка хочет сказать что запись
private var percent:Number = seek1.seekk.width;нужно переписать на
private var percent:Number = 0; + а здесь что является конструктором (возможно нужно дождаться ADDED_TO_STAGE )
public function MC_M()
{ percent = seek1.seekk.width;, а так в целом намного лучше чем раньше в кадрах))

Добавлено через 4 минуты
и еще одно

private function ifdrag():void
{
if (! drag_start)
{
seek1.scrub.addEventListener(Event.ENTER_FRAME,SC);


function SC(e:Event):void
{
seek1.scrub.x = seek1.seekk.x + (this.currentFrame/this.totalFrames)*percent;
}

}
}
не делайте так. Проблема в том что анонимная функция может быть удаленна сборщиком мусора, так как на неё не остается ссылки. Из-за этого Ваша программа может работать некорректно, а Вы тратить часы на её отладку. Всегда выносите функции в
internal function SC(e:Event):void
{
seek1.scrub.x = seek1.seekk.x + (this.currentFrame/this.totalFrames)*percent;
}

caseyryan
10.06.2013, 10:22
У вас ошибка в строке private var percent:Number = seek1.seekk.width; Обращаться к seek1.seekk нужно в конструкторе. seek1.seekk не существует до того момента, пока не создан главный класс.

Компилятор все равно перенесет этот код в конструктор. Так что проблема тут не в этом.

Ёлочка
10.06.2013, 14:01
Компилятор все равно перенесет этот код в конструктор. Так что проблема тут не в этом.А это тогда что?Ёлочка хочет сказать что запись нужно переписать на Именно так. :)

in4core
10.06.2013, 15:00
Также, _ используется перед определением приватных переменных По сути надо бы давно бросить делать это, 95% полей всегда приватные, и нет смысла делать подчеркивание.
Разделять глазами протектед от привата (методы ) - лучше группировкой, сверху все приваты, снизу протектеды например или наоборот. От паблик стоит отказаться вообще. Код будет раз в 10 приятнее и читабильнее чем с _.
Например
_num = _privateNum * 10;
this.x = _num;
Читается и выглядеть некрасиво по сравнению с
num = privateNum * 10;
this.x = num;
Как минимум чисто для глаз