Code Fix

初級

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でないことを確認する必要があります。

直し方: 02 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン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除算は必ずパニックになります。

直し方: 04 にします。

この問題を解いてみる →

パターン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が渡される可能性がある場合、割り算の前に事前チェックが必須です。

直し方: 05 にします。

この問題を解いてみる →

パターン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であることに気づかないまま割り算に使うと、実行時に初めて発覚します。

直し方: 03 にします。

この問題を解いてみる →

パターン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

コンパイル時には検出できず、実際にそのコードパスが実行されて初めてパニックします。

直し方: 01 にします。

この問題を解いてみる →

よくある誤解

「0で割っても何かの特別な値が返ってくるはず」という思い込みは整数の割り算には当てはまりません。浮動小数点数(float64)同士の割り算なら+Infになりますが、整数同士では必ずパニックします。

まとめ

integer divide by zero パニックの原因と直し方は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)