2017-09-22 4 views
0

は私は時折でクラッシュしたアプリケーションを有していた:"無効なメモリアドレスまたは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 
+1

'err'がnilの場合、' err.Error'は 'nil pointer dereference'です。 'err.Error()'はnilポインタを別の場所で参照している可能性がありますが、スタックトレースやコンテキストを使わずにどこでも呼び出すことはできません。 – JimB

+0

あなたはたぶん 'if err == nil {return errors.New("デバッグ用のテキスト: "+ err.Error())}' 'if err!= nil'の代わりに'? – dave

+0

@JimB - 私の最初の衝動はerrが無かったと思っていたが、returnは "if err!= nil"ブロックにあった。 –

答えて

0

わからない、

package main 

import (
    "errors" 
) 

func f() error { 
    err := error(nil) 
    return errors.New("Could not parse integer: " + err.Error()) 
} 

func main() { 
    f() 
} 

出力:

panic: runtime error: invalid memory address or nil pointer dereference 
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x44ecd6] 

goroutine 1 [running]: 
main.f(0xc420022070, 0xc420022070) 
    /home/peter/gopath/src/so/error.go:9 +0x26 
main.main() 
    /home/peter/gopath/src/so/error.go:13 +0x22 
exit status 2 

How to create a Minimal, Complete, and Verifiable example.を参照してください。

関連する問題