integer divide by zero パニックの原因と直し方
整数を0で割ると、実行時にパニックが発生しプログラムが異常終了します。0になりうる値は、割り算の前に事前チェックが必要です。
エラーメッセージの読み方
panic: runtime error: integer divide by zero
panic- パニック — 実行時に回復不能な状態になったことを示します。deferとrecoverで捕まえない限り、そのままプロセスが終了します
runtime error: integer divide by zero- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 package main 2 3 import "fmt" 4 5 func main() { 6 a := 10 7 b := 0 ^ 8 fmt.Println(a / b) 9 }
panic: runtime error: integer divide by zero
整数を0で割ると実行時にパニックします。割る前に0でないことを確認する必要があります。
直し方: 0 を 2 にします。
広告
広告スロット(未設定)
パターン2
1 package main 2 3 import "fmt" 4 5 func main() { 6 a := 20 7 b := 0 ^ 8 fmt.Println(a / b) 9 }
panic: runtime error: integer divide by zero
浮動小数点数の割り算と違い、整数同士の0除算は必ずパニックになります。
直し方: 0 を 4 にします。
パターン3
1 package main 2 3 import "fmt" 4 5 func main() { 6 a := 100 7 b := 0 ^ 8 fmt.Println(a / b) 9 }
panic: runtime error: integer divide by zero
ユーザー入力などで0が渡される可能性がある場合、割り算の前に事前チェックが必須です。
直し方: 0 を 5 にします。
パターン4
1 package main 2 3 import "fmt" 4 5 func main() { 6 a := 9 7 b := 0 ^ 8 fmt.Println(a / b) 9 }
panic: runtime error: integer divide by zero
変数bが0であることに気づかないまま割り算に使うと、実行時に初めて発覚します。
直し方: 0 を 3 にします。
パターン5
1 package main 2 3 import "fmt" 4 5 func main() { 6 a := 7 7 b := 0 ^ 8 fmt.Println(a / b) 9 }
panic: runtime error: integer divide by zero
コンパイル時には検出できず、実際にそのコードパスが実行されて初めてパニックします。
直し方: 0 を 1 にします。
よくある誤解
「0で割っても何かの特別な値が返ってくるはず」という思い込みは整数の割り算には当てはまりません。浮動小数点数(float64)同士の割り算なら+Infになりますが、整数同士では必ずパニックします。
まとめ
integer divide by zero パニックの原因と直し方は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。