Code Fix

初級

ZeroDivisionError: divided by 0 の原因と直し方

整数を0で割ると、ZeroDivisionErrorという例外が投げられプログラムが止まります。0で割られる可能性がある値は、事前にチェックする必要があります。

エラーメッセージの読み方

main.rb:4:in `/': divided by 0 (ZeroDivisionError)
main.rb
ファイル名
4
行番号 — 実際にクラッシュした行
/
発生場所 — <main> ならトップレベル、メソッド名ならそのメソッドの中
ZeroDivisionError
例外クラス — 何が起きたか。ここを検索するのが最短です
divided by 0
詳細メッセージ — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  no_shows = 0
 2  attendees = 25
 3  total_score = 450
 4  puts total_score / no_shows   
                            ^
main.rb:4:in `/': divided by 0 (ZeroDivisionError) from main.rb:4:in `<main>'

値が0の変数を割り算の分母に使うとZeroDivisionErrorになります。使うべき変数を取り違えていないか確認してください。

直し方: no_showsattendees にします。

この問題を解いてみる →

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

パターン2

 1  empty_boxes = 0
 2  full_boxes = 10
 3  budget = 1000
 4  puts budget / empty_boxes
                       ^
main.rb:4:in `/': divided by 0 (ZeroDivisionError) from main.rb:4:in `<main>'

整数を0で割るとRubyは例外を投げてプログラムを止めます。0になりうる変数は事前にチェックが必要です。

直し方: empty_boxesfull_boxes にします。

この問題を解いてみる →

パターン3

 1  failed_attempts = 0
 2  successful_attempts = 12
 3  hits = 96
 4  puts hits / failed_attempts    
                         ^
main.rb:4:in `/': divided by 0 (ZeroDivisionError) from main.rb:4:in `<main>'

変数名が似ていると、0の変数と非0の変数を取り違えやすくなります。

直し方: failed_attemptssuccessful_attempts にします。

この問題を解いてみる →

パターン4

 1  rest_days = 0
 2  travel_days = 6
 3  distance = 300
 4  puts distance / rest_days  
                         ^
main.rb:4:in `/': divided by 0 (ZeroDivisionError) from main.rb:4:in `<main>'

0で割る可能性がある値は、計算に使う前に0でないことを確認する必要があります。

直し方: rest_daystravel_days にします。

この問題を解いてみる →

パターン5

 1  empty_groups = 0
 2  full_groups = 8
 3  people = 40
 4  puts people / empty_groups
                        ^
main.rb:4:in `/': divided by 0 (ZeroDivisionError) from main.rb:4:in `<main>'

浮動小数点数同士の0除算はInfinityになりますが、整数同士では例外になる点に注意してください。

直し方: empty_groupsfull_groups にします。

この問題を解いてみる →

よくある誤解

「0で割っても Infinity のような特別な値が返ってくるはず」という思い込みは整数同士の割り算には当てはまりません。浮動小数点数(1.0など)同士の割り算ならInfinityになりますが、整数同士では例外が発生します。

まとめ

ZeroDivisionError: divided by 0は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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