Code Fix

中級

HashMapを存在しないキーで [] 添字アクセスすると no entry found for key パニックになる

HashMapに[]で添字アクセスした際、そのキーが存在しないとパニックします。存在するかどうか分からないキーを扱う場合は、getメソッドを使いOptionとして受け取る必要があります。

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

thread 'main' panicked at main.rs:5:24:
main.rs
ファイル名
5
行番号 — 実際にクラッシュした行
24
列番号
panicked
パニック — 実行時に回復不能な状態になったことを示します。tryやResultで捕まえない限り、そのままプロセスが終了します
no entry found for key
詳細メッセージ — どの値が問題だったか

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

パターン1

 1  use std::collections::HashMap;
 2  fn main() {
 3      let mut ages: HashMap<&str, i32> = HashMap::new();
 4      ages.insert("taro", 20);
 5      println!("{}", ages["hanako"]);
                                ^
 6  }
thread 'main' panicked at main.rs:5:24: no entry found for key

HashMapの[]演算子は、存在しないキーを指定するとOptionを返さずその場でパニックします。

直し方: hanakotaro にします。

この問題を解いてみる →

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

パターン2

 1  use std::collections::HashMap;
 2  fn main() {
 3      let mut prices: HashMap<&str, i32> = HashMap::new();
 4      prices.insert("apple", 100);
 5      println!("{}", prices["banana"]);
                                  ^
 6  }
thread 'main' panicked at main.rs:5:26: no entry found for key

存在するか分からないキーを扱う場合は、[]の代わりにgetを使いOptionとして受け取るべきです。

直し方: bananaapple にします。

この問題を解いてみる →

パターン3

 1  use std::collections::HashMap;
 2  fn main() {
 3      let mut stock: HashMap<&str, i32> = HashMap::new();
 4      stock.insert("pen", 5);
 5      println!("{}", stock["pencil"]);
                                 ^
 6  }
thread 'main' panicked at main.rs:5:25: no entry found for key

配列の範囲外アクセスと違い、HashMapの欠損キーへのアクセスは常にパニックという形で現れます。

直し方: pencilpen にします。

この問題を解いてみる →

パターン4

 1  use std::collections::HashMap;
 2  fn main() {
 3      let mut scores: HashMap<&str, i32> = HashMap::new();
 4      scores.insert("math", 90);
 5      println!("{}", scores["science"]);
                                  ^
 6  }
thread 'main' panicked at main.rs:5:26: no entry found for key

登録していない科目名を指定すると、HashMapは静かにデフォルト値を返すことはせずパニックします。

直し方: sciencemath にします。

この問題を解いてみる →

パターン5

 1  use std::collections::HashMap;
 2  fn main() {
 3      let mut config: HashMap<&str, i32> = HashMap::new();
 4      config.insert("timeout", 30);
 5      println!("{}", config["retries"]);
                                  ^
 6  }
thread 'main' panicked at main.rs:5:26: no entry found for key

設定値の読み出しでキー名を間違えると、実行時にパニックとして表面化します。

直し方: retriestimeout にします。

この問題を解いてみる →

よくある誤解

「存在しないキーで参照すれば、配列の範囲外アクセスのようにnilや空の値が返るはず」という思い込みは誤りです。HashMapの[]演算子は見つからない場合にエラーを返さず、その場でパニックします。

まとめ

HashMapを存在しないキーで [] 添字アクセスすると no entry found for key パニックになるは中級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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