は私は時折でクラッシュしたアプリケーションを有していた:"無効なメモリアドレスまたはnilポインタの逆参照"を引き起こす可能性のあるエラーがありますか?
パニック:ランタイムエラー:無効なメモリアドレスまたはゼロポインタ参照 [信号SIGSEGV:セグメンテーション違反コード= 0x1のADDR = 0x20のPC = 0x122e64a]
をトレースは構造体とerrors.New( "デバッグ用のテキスト:" + err.Error())を返すreturn文につながっていました。
構造体には逆参照されるものがないようですポインタを使用していましたが、関数を再構成して参照渡しを使用し、関数を返す必要はありませんでした。それはerrors.New()を返しただけです。パニックはまだ起こった。
私は関数を実行してエラーを返しました。エラーはありません.New()文字列+ err.Error()。今や私は恐怖をそれ以上は誘発していないようです...
質問:error.New()は、そのタイプのパニックを引き起こす文字列に連結されたerr.Error()を使用しています。 return文?
EDIT:
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())
}
EDIT 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'がnilの場合、' err.Error'は 'nil pointer dereference'です。 'err.Error()'はnilポインタを別の場所で参照している可能性がありますが、スタックトレースやコンテキストを使わずにどこでも呼び出すことはできません。 – JimB
あなたはたぶん 'if err == nil {return errors.New("デバッグ用のテキスト: "+ err.Error())}' 'if err!= nil'の代わりに'? – dave
@JimB - 私の最初の衝動はerrが無かったと思っていたが、returnは "if err!= nil"ブロックにあった。 –