我有一個應用程序,其中我被偶爾與崩潰:錯誤中是否有可能觸發「無效內存地址或無指針解除引用」的內容?
恐慌:運行時錯誤:無效的內存地址或零指針引用 [信號SIGSEGV:分割違反代碼=爲0x1 ADDR = 0x20的PC = 0x122e64a]
跟蹤不斷導致返回語句返回一個結構和errors.New(「調試的一些文本:」+ err.Error())
該結構似乎沒有任何東西可以解引用指針,但我重構了函數,因此它使用了一個按引用傳遞並且不需要返回該函數;它只返回errors.New()。恐慌仍然發生。
我經歷了函數,並改變它,所以它只返回錯誤,沒有errors.New()字符串加上err.Error()。現在我似乎無法再引發恐慌了......
所以問題:是否有關於errors.New()使用err.Error()連接到將導致該類型的恐慌返回聲明?
編輯:添加的代碼片段觸發偶爾恐慌:
strctStats.intThreadPool80ConnectionCount, err = strconv.ParseInt(strctStats.strThreadPool80ConnectionCount, 10, 64)
if err != nil {
// Exit external application; send the closing sequences
tmPause := time.NewTimer(time.Second * 2)
<-tmPause.C
stdIn.Write([]byte("close\n"))
tmPause = time.NewTimer(time.Second * 2)
<-tmPause.C
stdIn.Write([]byte("quit\n"))
return errors.New("Could not parse integer: " + err.Error())
}
編輯2:@lmars請求的堆棧跟蹤。這是轉儲到控制檯。不知道它是如何幫助(你能解釋一下它告訴超越其中的錯誤/呼叫發起函數棧和行號?我是新來的一些痕跡的工作)
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x122e64a]
goroutine 1 [running]:
main.JMXCheck(0xc42012c000, 0x1a, 0xc420018084, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/Users/bsilver/go/src/nagios_tomcat_threadinfo/nagios_tomcat_threadinfo.go:590 +0x38ca
main.main()
/Users/bsilver/go/src/nagios_tomcat_threadinfo/nagios_tomcat_threadinfo.go:146 +0x3cc
如果'err'爲零,那麼'err.Error'是一個'零指針解引用'。有可能'err.Error()'在其他地方解引用一個零指針,但是我們不能在沒有你調用它的地方放置棧跟蹤或上下文。 – JimB
你可能會做'if err == nil {return errors.New(「用於調試的一些文本:」+ err.Error())}'而不是'if err!= nil'? – dave
@JimB - 我的第一個衝動是認爲err是零,但是回報是在「if err!= nil」塊中。 –