Как это исправить: Ошибка TypeError: ошибка # 1009: не удается получить доступ к свойству или методу нулевой ссылки на объект

#xml #flash #actionscript-3 #flash-cs5

#xml #flash #actionscript-3 #flash-cs5

Вопрос:

я новичок в использовании flash и пытаюсь создать игру-викторину с несколькими типами, используя flash cs5 и as3. в игре содержимое или данные записываются в XML-файл.

я сталкиваюсь с рядом проблем, и мне немного сложно понять, какое решение можно использовать.

  1. у меня есть переменная qno. qno используется для определения количества вопросов, которые будут вызваны программой. в моей игре мне нужно вывести 5 вопросов. если qno достигает 5, программа должна вызвать следующий кадр, который покажет табло. моя проблема в том, что qno не увеличивается. эта проблема затрагивает мою 3-ю проблему, о которой я расскажу позже. я выяснил, что это ошибка, которая вызвала проблему: TypeError: Error #1009: Cannot access a property or method of a null object reference. как мне это исправить?

  2. РЕШАЕМАЯ ^^, (динамический текст вызвал эту проблему, которая повлияла на вопросы и варианты выбора. но теперь исправлено я уже сказал, что я вызываю вопрос и варианты выбора в файле xml. программа вызывает код, но у меня возникла одна проблема. он не показывает полный вопрос и варианты выбора. под этим я подразумевал, например, вопрос в том, как питаются птицы?когда вы запускаете программу, она выводит только how do the b. это происходит так же, как и варианты выбора. он не показывает полный вопрос и варианты выбора.

  3. это пока не так важно, но речь идет о подсчете очков. я не знаю, увеличивает ли программа переменную правильного и неправильного ответа. но у меня уже есть код для этого. я знаю, что сначала мне нужно решить первую проблему, прежде чем переходить к этой проблеме.


это набор кодов, которые я использую

это код, используемый для вызова XML-файла, который находится в кадре 1

  var questions:Array=new Array(); 
 var answers:Array=new Array(); 
 var loader:URLLoader = new URLLoader();
 loader.addEventListener(Event.COMPLETE, loadXML);
 loader.load(new URLRequest("sample.xml"));
 function loadXML(e:Event):void 
 { 
var myxml = new XML(e.target.data);
var loop =myxml.ques.length();
for (var i=0;i<loop;i  )
{
    questions[i]=myxml.ques[i].q1;
    answers[i]=[myxml.ques[i].op1,myxml.ques[i].op2,myxml.ques[i].op3];
}
gotoAndPlay(2);
 }
 stop();
  

это основной код, в котором находится проблема

  var qno=0;
 var rnd1; 
 var rnd2;
 tick.visible=false;
 cross.visible=false;
 var right_answers=0;
 var wrong_answers=0;
 function change_question()
 {
if(tick.visible)
{
    right_answers  ;
}
if(cross.visible)
{
    wrong_answers  ;
}
if(qno==1)
{
    gotoAndPlay(3);
}
else
{
    tick.visible=false;
    cross.visible=false;
    rnd1=Math.ceil(Math.random()*3);
    rnd2=Math.ceil(Math.random()*questions.length)-1;
    q.text=questions[rnd2];
    if(questions[rnd2]=="x")
    {   
        change_question();
    }
    questions[rnd2]="x";
    enable_disable(1);
    if(rnd1==1)
    {
        opt1.text=answers[rnd2][0];
        opt2.text=answers[rnd2][1];
        opt3.text=answers[rnd2][2];
    } 
    if(rnd1==2)
    {
        opt1.text=answers[rnd2][2];
        opt2.text=answers[rnd2][0];
        opt3.text=answers[rnd2][1];
    } 
    if(rnd1==3)
    {
        opt1.text=answers[rnd2][1];
        opt2.text=answers[rnd2][2];
        opt3.text=answers[rnd2][0];
    } 
}
 }
 function enable_disable(a)
 { 
if(a==0)
{
    shade1.mouseEnabled=false;
    shade2.mouseEnabled=false;
    shade3.mouseEnabled=false;
} 
if(a==1)
{
    shade1.mouseEnabled=true;
    shade2.mouseEnabled=true;
    shade3.mouseEnabled=true;
}
 }
 change_question();
 next_b.addEventListener(MouseEvent.CLICK, ButtonAction1);
 function ButtonAction1(eventObject:MouseEvent) 
 {
qno  ;
change_question();
 } 
 shade1.addEventListener(MouseEvent.CLICK, ButtonAction2); 
 shade2.addEventListener(MouseEvent.CLICK, ButtonAction3); 
 shade3.addEventListener(MouseEvent.CLICK, ButtonAction4); 
 function ButtonAction2(eventObject:MouseEvent)
 {
enable_disable(0);
if(rnd1==1)
{
    tick.visible=true;
    tick.y=shade1.y;
}
else
{
    cross.visible=true;
    cross.y=shade1.y;
}
 }
 function ButtonAction3(eventObject:MouseEvent)
 {
enable_disable(0);
if(rnd1==2)
{
    tick.visible=true;
    tick.y=shade2.y;
}
else
{
    cross.visible=true;
    cross.y=shade2.y;
}
 }
 function ButtonAction4(eventObject:MouseEvent)
 {
enable_disable(0);
if(rnd1==3)
{
    tick.visible=true;
    tick.y=shade3.y;
}
else
{
    cross.visible=true;
    cross.y=shade3.y;
}
 }
 stop();
  

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

Ответ №1:

При разработке на Actionscript 3 (или на любом другом языке) важно научиться тестировать и отлаживать.

Поскольку вы новичок во Flash, переходите шаг за шагом. При создании новой функции сначала протестируйте ее, убедитесь, что она возвращает ожидаемый результат, затем двигайтесь дальше.

Это должно быть таким же простым, как выполнение этого:

функция init():void
{
 trace('была вызвана функция инициализации, ура! ;)');
}

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

  //for example
 var myxml:XML = new XML(e.target.data);
  

Перед вызовом цикла убедитесь, что у вас есть значение!

  var loop:int =myxml.ques.length();
 if ( loop > 0 )
     trace("loop =" , loop );
 else
     trace('loop = 0, i will not increment!!!');
  

и т.д…

Надеюсь, это поможет!

Комментарии:

1. я уже проверил коды ранее и перепечатал его. я обнаружил, что реальной проблемой, вызывающей программу, является функция увеличения. qno, не будет увеличиваться

2. Ошибка типа # 1009: не удается получить доступ к свойству или методу нулевой ссылки на объект. в quiz_fla::MainTimeline/change_question() в quiz_fla::MainTimeline/ButtonAction1()

3. Это просто означает, что вы пытаетесь получить доступ к объекту, который еще не создан или имеет нулевое значение … вероятно, вызвано «галочкой» или «крестом»

4. сэр @PatrickS, «галочка» и «крест» — это экземпляры имен определенного объекта в коде. галочка появляется, когда ответ правильный, поэтому крест появляется, когда ответ неправильный. извините, если вы неправильно поняли это: (я думаю, что причина ошибки в этом коде if(qno==1) { gotoAndPlay(3); }

5. это также может помочь, я думаю, это первая причина ошибки function ButtonAction1(eventObject:MouseEvent) { qno = qno 1; change_question(); } , которая переходит к следующему вопросу при нажатии кнопки, но она не увеличивается, что вызывает указанную ошибку, о которой я упоминал ранее. я все еще пытаюсь найти решение своей проблемы, но я все равно был бы признателен за вашу помощь, сэр: (