2013-06-10 2 views
0

은 구조체가문자열에 대한이 참조가 Null 참조 예외를 일으킬 수 있습니까?</p> <pre><code>public struct ReturnedCommands { public string key; public string command; }; </code></pre> <p>... 가변 :

public static ReturnedCommands returnedCommands; 

... 및 null 참조 예외는 값 "3"을 반환 발생 :

public bool PendingCommandsExecute_QUERY() 
{ 
    int i = 0; 
    try 
    { 
     i = 1; 
     cmdResults b = cmdResults.cmdFail; 
     bool retVal = false; 
     string command = "QUERY"; 

     if (returnedCommands.key != command) 
      return false; 

     HashResultsAdd(command, "Started"); 
     i = 2; 

     HashStatus.Clear(); 

     string sNum = PendingCommands.SiteFetchSiteNumber; 
     i = 3; // <-- last one reached (debug int displayed in NRE) 
     string s = string.Empty; 
     if (returnedCommands.command != null) 
     { 
      s = command + "|" + sNum.Trim() + "|t_inv|SELECT|" + returnedCommands.command; 
     } 
     i = 4; 
     HashStatusAdd(command, s); 
     . . . 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message + " reached debug int " + i.ToString()); 
    } 
    return true; 
} // PendingCommandsExecute_QUERY 

NRE가 발생하면 "예외 : 널 참조 예외가 디버그 int 3에 도달했습니다"가 표시됩니다. returnCommands.command를 참조하면서 imploding해야합니다. 그러나 returnedCommands.command는 단순히 문자열이므로 어떻게 될까요? 먼저 null이 아닌지 확인합니다 ("if (returnedCommands.command! = null)"행). 테스트가 문제가되지 않도록 안전해야합니다. 그 테스트를 통과한다면 그것은 단지 문자열 연결 연산 일 뿐이므로 어떻게 NRE를 일으킬 수 있습니까?

+2

오컬트 int를 사용하는 대신 디버거를 사용하여 영향을받은 라인을 단계별로 실행할 수 있습니까? – Nolonar

+0

'sNum'을 확인 했습니까? 아마도 null이 될 것입니다. – Jason

+3

그건 그렇고 :'ex.ToString()'은'ex.Message'보다 훨씬 많은 정보를 얻습니다. – Nolonar

답변

5

PendingCommands.SiteFetchSiteNumber가 null (따라서 sNum가 null) 경우 전체 스택이 당신을 제공한다 추적 보여 주면, 다음이 당신이 sNum.Trim 전화 null 참조 예외() 또한

을 일으킬 것 오류가 발생한 정확한 줄 번호. 증분 값을 사용하여 디버깅하는 것보다 훨씬 간단합니다.

+0

"i = 3"이라는 할당은 해당 참조 뒤에 있으므로 예외의 i 값은 2가되지 않습니까? –

+0

아니요, 할당 i = 3은 sNum = PendingCommands.SiteFetchSiteNumber를 지정한 후입니다. 이것은 변수에 null을 할당하는 데 유효합니다. 문제는 몇 줄 뒤에 "null 객체"에 대한 메소드 (자르기)를 호출하려고 시도하는 것입니다. –

+0

SiteFetchSiteNumber가 null입니다. 이제 나는 이유를 찾아야 만한다 ... –

1

공용 정적 멤버의 다중 스레드 액세스가 누락되었을 가능성이 큽니다.

public static ReturnedCommands returnedCommands; 

나는 정확히이 달성하고자하는 것을 볼 수 있지만, 나는 그것이 가장 가능성이 다른 스레드가이 멤버에 액세스 할 때 실패하고 널 (null)으로 덮어 것이기 때문에 당신이 아키텍처를 검토하는 것이 좋습니다.

아마도 명령 대기열을 사용할 수 있습니다.

+0

네,이 응용 프로그램은 총 난장판이며, 리팩토링하고, 리팩토링하고, 재구성해야하며, 거기서 당신과 논쟁 할 수 없습니다. 그것이 일어날 지 여부는 나에게 달려 있지 않습니다. –

+0

이 두 가지 답변을 모두 맞는 것으로 표시 할 수 있기를 바랍니다. 의심 할 여지없이이 답변도 있습니다. –

관련 문제

 관련 문제