수색…


소개

오류 1009는 값이 null 변수 또는 특성에서 값을 수신하려고 할 때 발생하는 일반적인 오류입니다. 제공된 예제는 오류를 완화하는 방법에 대한 권장 사항과 함께이 오류가 발생한 다양한 경우를 보여줍니다.

비고

두려워하고 종종 "오류 1009 : null 개체 참조의 속성이나 메서드에 액세스 할 수 없습니다"라는 메시지는 일부 데이터가 null로 표시되지만 채워진 개체로 사용하려고하는 신호입니다. 이 문제를 일으킬 수있는 많은 유형의 문제가 있으며 오류가 발생한 코드에 대해 각각의 문제를 테스트해야합니다.

스테이지를 사용할 수 없습니다.

개발자는 stage 또는 Flash 스테이지에 대한 액세스를 원하는 코드를 작성하여 리스너를 추가하는 경우가 있습니다. 처음 작동하면 갑자기 실패하여 오류 1009가 발생합니다. 문제의 코드는 타임 라인에있을 수 있습니다. 코드를 추가하는 첫 번째 시도이며 아직 사용중인 많은 자습서입니다. 타임 라인 코드 레이어는 코드를 배치합니다.

public class Main extends MovieClip {
    public function Main() {
        stage.addEventListener(Event.ENTER_FRAME,update); // here

이 코드가 작동하지 않는 이유는 간단합니다. 표시 객체가 처음 인스턴스화 된 다음 표시 목록에 추가되고 표시 목록에서 벗어나는 동안 stage 는 null입니다.

다음과 같은 코드가 더 나쁜 경우 :

stage.addEventListener(Event.ENTER_FRAME,update); // here

타임 라인에 배치됩니다. Main 객체는 GUI를 통해 무대에 올려 놓은 채 얼마간 작동 할 수 있습니다. 그런 다음 SWF가 다른 SWF에서로드되고 갑자기 코드가 손상됩니다. 이것은 SWF가 플레이어에 의해 직접로드되고로드가 비동기 적으로 처리 될 때 Main 의 프레임이 다른 방식으로 구성되기 때문에 발생합니다. 해결책은 Event.ADDED_TO_STAGE 리스너를 사용하고 스테이지를 처리하는 모든 코드를 배치하고 리스너 자체를 타임 라인 대신 AS 파일에 배치하는 것입니다.

잘못된 유형 변환

function listener(e:Event):void {
    var m:MovieClip=e.target as MovieClip;
    m.x++;
}

이러한 리스너가 MovieClip 하위 항목 (예 : Sprite )이 아닌 객체에 연결되면 유형 변환이 실패하고 그 결과로 후속 작업이 1009 오류를 발생시킵니다.

인스턴스화되지 않은 객체

var a:Object;
trace(a); // null
trace(a.b); // Error 1009

여기서 객체 참조는 선언되지만 null이 아닌 값을 new 지정하거나 할당 한 값이 할당되지 않습니다. 해당 속성 또는 메서드를 요청하면 1009 오류가 발생합니다.

다층 식

x=anObject.aProperty.anotherProperty.getSomething().data;

여기서 도트 앞에있는 모든 객체는 null이 될 수 있으며 복잡한 객체를 반환하는 메서드를 사용하면 null 오류를 디버그하기위한 복잡성 만 증가합니다. 이 방법이 네트워크를 통해 데이터를 가져 오는 것과 같이 외부적인 오류가 발생하기 쉬운 경우에는 최악의 경우입니다.

처리되지 않은 함수 결과

s=this.getChildByName("garbage");
if (s.parent==this) {...}

getChildByName() 은 입력을 처리 할 때 오류가 발생하면 null을 반환 할 수있는 많은 함수 중 하나입니다. 따라서 null을 반환 할 가능성이있는 함수에서 객체를받는 경우 먼저 null을 확인하십시오. s 가 null인지 먼저 확인하지 않고 속성을 즉시 쿼리합니다.이 경우 1009 오류가 발생합니다.

잊어 버린 이벤트 리스너

addEventListener(Event.ENTER_FRAME,moveChild);
function moveChild(e:Event):void {
    childMC.x++;
    if (childMC.x>1000) {
        gotoAndStop(2);
    }
}

이 예제는 디자인 타임에 Main 에 추가 된 childMC 를 이동 childMC gotoAndStop() 이 호출 될 때 프레임 2에 childMC 가 없으면 즉시 1009를 childMC .이 주된 이유는 재생 헤드가 통과 할 때마다 gotoAndStop() , gotoAndPlay() 사용하여 현재 프레임에서 키프 레임으로 분리 된 대상 프레임을 사용하거나 SWF가 기본 프레임 인 경우 일반 재생으로 키 프레임 (이전 프레임의 객체 세트를 상속하지 않는 프레임 gotoAndStop() 현재 프레임의 내용이 파괴 되고 새로운 내용이 GUI에서 저장된 데이터를 사용하여 생성됩니다. 따라서 새 프레임에 childMC 라는 자식이 없으면 속성 요청은 null을 반환하고 1009가 발생합니다.

두 개의 이벤트 리스너를 추가하지만 하나만 제거하거나 한 객체에 리스너를 추가하는 경우에도 동일한 원리가 적용됩니다. removeEventListener 호출은 객체에 개별 이벤트 리스너가 연결되어 있지 않으면 경고하지 않으므로주의 깊게 이벤트 리스너를 추가 및 제거하는 코드를 읽습니다.

참고 : Timer 객체를 사용하여 setInterval()setTimeout() 호출하면 이벤트 리스너가 만들어지며 이러한 이벤트 리스너도 올바르게 지워집니다.

프레임 기반 객체에 대한 유효하지 않은 참조

때로는 gotoAndStop() 이 코드 기반에서 호출되어 일부 프레임 기반 속성을 참조합니다. 그러나 프레임이 변경된 직후 현재 프레임에있는 속성에 대한 모든 링크가 무효화되므로 해당 프레임과 관련된 모든 처리가 즉시 종결되어야합니다.

다음과 같은 두 가지 일반적인 시나리오가 발생합니다. 첫째, 루프는 gotoAndStop() 호출 이후에 끝나지 않습니다.

for each (bullet in bullets) {
    if (player.hitTestObject(bullet)) gotoAndStop("gameOver");
}

여기서 1009 오류는 gotoAndStop() 호출을 처리하는 동안 player MC가 삭제되었지만 루프가 계속 진행 중이며 now-null 링크를 참조하여 hitTestObject() 를 가져 오는 것을 의미합니다. 조건이 if (bullet.hitTestObject(player)) 대신에 오류가 발생하면 # 2007 "parameter hitTestObject가 null이 아니어야합니다."라고 말합니다. 해결 방법은 gotoAndStop() 을 호출 한 직후 return 문을 넣는 것입니다.

두 번째 경우는 동일한 이벤트의 여러 이벤트 리스너입니다. 이렇게 :

stage.addEventListener(Event.ENTER_FRAME,func1);
stage.addEventListener(Event.ENTER_FRAME,func2);
function func1(e:Event):void {
    if (condition()) {
        gotoAndStop(2);
    }
}

여기서 condition() 이 true이면 첫 번째 수신기는 gotoAndStop() 수행하지만 두 번째 수신기는 여전히 실행되고 프레임의 객체를 참조하면 1009 오류가 발생합니다. 이 솔루션은 단일 이벤트에서 단일 리스너를 피하기 위해 하나의 리스너가 이벤트의 모든 상황을 처리하고 프레임 변경이 필요한 경우 제대로 종료 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow