Просмотр полной версии : Ошибка 1009
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at MC_M()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
Как ее можно обойти? Вроде все исправил но это осталось...
Не дёргать методы и поля обьекта, который null. Научиться отлаживать, в дебаггере скорее всего конкретную строку бы увидели и вопрос бы не встал. Без кода короче ничего больше не скажешь, но тут эта ошибка обычно от того, что stage у DisplayObject null, пока этот обьект на сцену не добавили.
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?
В дебаге запустить. И пошагово пройти этот конструктор (если упадёт не заходя, то seek1.seekk.width узнать не смогло, т.е. seek1 null или seek1.seekk). Если MC_M - не Document class, то явно slider_mc.mc.stage - это null, про что написал.
Да правильно вы сказали это из за seekk который лежит в seek1. А как можно обратиться из класса к нему ?? я только начал в классах просто в кадре писал все получалось...
У вас ошибка в строке private var percent:Number = seek1.seekk.width; Обращаться к seek1.seekk нужно в конструкторе. seek1.seekk не существует до того момента, пока не создан главный класс.
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 не существует до того момента, пока не создан главный класс.
Компилятор все равно перенесет этот код в конструктор. Так что проблема тут не в этом.
Компилятор все равно перенесет этот код в конструктор. Так что проблема тут не в этом.А это тогда что?Ёлочка хочет сказать что запись нужно переписать на Именно так. :)
Также, _ используется перед определением приватных переменных По сути надо бы давно бросить делать это, 95% полей всегда приватные, и нет смысла делать подчеркивание.
Разделять глазами протектед от привата (методы ) - лучше группировкой, сверху все приваты, снизу протектеды например или наоборот. От паблик стоит отказаться вообще. Код будет раз в 10 приятнее и читабильнее чем с _.
Например
_num = _privateNum * 10;
this.x = _num;
Читается и выглядеть некрасиво по сравнению с
num = privateNum * 10;
this.x = num;
Как минимум чисто для глаз
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.