"인스턴스화하려는 개체가 null입니다"그러나 작동합니다. 오류를 무시해도됩니까?


18

이것은 나에게 결코 일어나지 않았기 때문에 약간 혼란스러워했습니다.

GameObject someObject = Instantiate (Resources.Load ("Prefabs/Items/" + someName)) as GameObject;

오류가 발생하지만 객체가 실제로 인스턴스화되고 모든 것이 의도 한대로 작동합니다. 몇 번이나 이것을 재현해도 오류가 프로그램을 멈추지 않습니다.

이 오류를 무시할 수 있습니까? 또는 보이지 않는 문제가 있습니까?


32
오류를 무시해서는 안됩니다. 그들은 항상 이유가 있습니다;)
Gabriele Vierti

5
"작동하는"이유만으로 오류를 무시하지 않는다는 생각을하고 싶습니다. 정의상 오류가 있으면 작동하지 않습니다. 물론, 그것은 당신이 원하는 모든 것을하는 것처럼 보일지 모르지만 그것은 단지 깨진 비트를 아직 찾지 못했다는 것을 의미합니다.
기금 모니카의 소송

답변:


46

Intantiate()라인에 예외가 발생 하더라도 객체가 올바르게 인스턴스화되면 다른 스크립트 인스턴스에서 오류가 발생합니다. 실수로 장면에 두 번째 사본이있을 수 있습니다.

하나의 인스턴스가 올바르게 구성되어 Instantiate()오류없이 예상대로 수행 하므로 원하는대로 오브젝트가 작성됩니다.

다른 인스턴스가 잘못 구성되어 오류가 발생합니다. 그러나 올바르게 구성된 인스턴스를보고있는 경우이 오류는 아무데서나 나타나고 눈에 띄는 결과가 없습니다.

원치 않는 장면 복제를 추적하는 데 도움이되도록 시작시 또는 해당 행 바로 앞의 null 검사에서 객체의 경로를 인쇄 할 수 있습니다.

이 오류를 무시해서는 안됩니다.

기껏해야 불필요하게 계산주기가 불타고 있습니다. 최악의 경우, 게임이 완전히 이해하지 못하는 일을하고 있다는 신호이며 이는 훨씬 큰 문제의 근원 일 수 있습니다.


12
+1, 오류는 경고와 동일하지 않습니다. 오류가있는 경우 언제 게임 충돌로 에스컬레이션되는지 알 수 없습니다.
TomTsagk

13
경고를 무시하는 것이 항상 안전하지는 않습니다. 오류가 아니더라도 게임이 충돌하는 상황이 발생할 수 있습니다.
션 버튼

2
@SeanBurton에 동의합니다. 경고를 무시하는 것은 안전한 방법이 아닙니다. 경고의 원인을 이해하고 코드에서 문제를 일으키지 않는 것이 편한 경우에만 경고를 무시해야합니다. 그래도 더 잘 할 수 없다면 스스로에게 물어보십시오.
잭 에이 들리

3
내가 대규모 팀과 함께 작업 한 모든 프로젝트는 어느 시점에서 "무시할 수있는"경고로 과부하되어 진짜 문제를 가리기 시작했습니다. 따라서 경고를 심각하게 취급하는 것을 옹호하고, 피할 수없는 경우 경고를 무시하는 것이 안전한 이유를 명확하게 설명하는 주석과 함께 관련 줄에 대해 경고를 비활성화합니다.
DMGregory

1
나는 @DMGregory와 100 %이고, 아주 작은 팀에서만 일했지만 경고가 쌓이기 시작한 한 쌍의 시간은 "정품"문제를 찾는 것이 끔찍한 일이거나 항상 놓칠 것입니다. 내 MO는 테스트를 제외하고 로그를 깨끗하게 유지하는 것입니다. 플러그인 코드에서 경고를 비활성화해야하더라도 (경고로 플러그인을 만들지 마십시오) 장기 IMO에서는 훨씬 좋습니다. 편집 : 명확하게하기 위해 다른 방법이 없다고 확신하지 않는 한 경고를 비활성화하지 마십시오 (시간의 0.001 % 발생) 항상 실제로 수정하십시오.
Trisibo

21

대답

질문에 직접 대답하여 시작하겠습니다.

작동하지만 오류를 무시할 수 있습니까?

당신 은 할 수 있습니다. 당신이 해야 뭔가가 잘못 가고 의미하기 때문에,하지. 이 오류에 익숙해 지지만 "숨기거나"다른 오류가 발생할 수 있습니다.

현재 오류 메시지가 있으며 여전히 올바르게 작동합니다. 다른 방법의 주위에, 그것은 하지 피드백 왜 훨씬 더 나쁘다 : 작업하고 있지 않는 (인식되지 않거나 오히려)!

조언

이것이 어디에서 왔는지 알아 내려면이 모든 것을 여러 줄로 나눕니다.

string resourceLocation = "Prefabs/Items/" + someName;
Object prefab = Resources.Load(resourceLocation);
Object instance = Instantiate(prefab);
GameObject someObject = instance as GameObject;

오류는 발생한 라인 만 알려줍니다. 이 코드에서 오류가 발생하면 줄 번호에 어떤 부분이 잘못되었는지 알려줍니다. 또한의 일반 버전을 사용 Resources.Load하는 것이 좋습니다. 실제로 걱정할 필요가 없습니다.

string resourceLocation = "Prefabs/Items/" + someName;
GameObject prefab = Resources.Load<GameObject>(resourceLocation);
GameObject someObject = Instantiate(prefab);

이유 찾기

  • 이제 약간의 Unity 경험에 따르면 "인스턴스화하려는 객체가 null입니다"는 Instantiate() .
  • 그래서, 그 수단 prefab입니다null .
  • 그래서 그것은 Resources.Load반환 을 의미 합니다null .
  • 에 대한 문서는Resources.Load "말한다 반환의 자산 path은 발견 할 수있는 경우가 그렇지 않은 경우는 null를 돌려줍니다. "
  • 그 수단 그래서 (I라는 문자열 지정된 경로를 찾을 수 없습니다 resourceLocation)

이 경로에 문제가 있으므로 확실한 첫 번째 단계는 Debug.Log를 사용하여 실제로 무엇이 끝나는 지 확인하는 것입니다. "모든 것이 의도 한대로 작동 함"으로, 한 버전이 작동하는 곳에서 일부 복제가 진행되고 다른 버전에서이 오류가 발생할 가능성이 있습니다.

이 경우 Debug.Log의 2 매개 변수 버전을 사용하는 것이 좋습니다 Debug.Log(resourceLocation, gameObject);. 이제 Unity 에디터에서 로그 메시지를 클릭 GameObject하면 출처를 선택합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.