MeWrite Docs

called `Option::unwrap()` on a `None` value

RustでNone値に対してunwrap()を呼び出した際に発生するpanicエラー

概要

called Option::unwrap() on a None value は、RustでOption型のNone値に対してunwrap()を呼び出した際に発生するpanicです。

エラーメッセージ

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value'
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ...'

原因

1. Noneに対するunwrap()

1
2
let value: Option<i32> = None;
let num = value.unwrap(); // panic!

2. 見つからない要素への直接アクセス

1
2
let vec = vec![1, 2, 3];
let item = vec.get(10).unwrap(); // panic!

3. HashMapの存在しないキー

1
2
3
use std::collections::HashMap;
let map: HashMap<&str, i32> = HashMap::new();
let value = map.get("key").unwrap(); // panic!

解決策

1. unwrap_or でデフォルト値を指定

1
2
let value: Option<i32> = None;
let num = value.unwrap_or(0); // 0

2. unwrap_or_else で遅延評価

1
2
let value: Option<String> = None;
let text = value.unwrap_or_else(|| String::from("default"));

3. if let でパターンマッチング

1
2
3
4
5
6
7
let value: Option<i32> = Some(42);

if let Some(num) = value {
    println!("値: {}", num);
} else {
    println!("値がありません");
}

4. match で明示的に処理

1
2
3
4
5
6
let value: Option<i32> = None;

match value {
    Some(num) => println!("値: {}", num),
    None => println!("値がありません"),
}

5. ? 演算子で早期リターン

1
2
3
4
fn get_value(opt: Option<i32>) -> Option<i32> {
    let num = opt?; // Noneなら早期リターン
    Some(num * 2)
}

6. expect でカスタムエラーメッセージ

1
2
let value: Option<i32> = None;
let num = value.expect("値が必要です"); // panic with custom message

7. ok_or でResultに変換

1
2
3
4
fn process(opt: Option<i32>) -> Result<i32, &'static str> {
    let num = opt.ok_or("値がありません")?;
    Ok(num * 2)
}

unwrapを使って良い場面

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 1. テストコード
#[test]
fn test_something() {
    let result = some_function();
    assert_eq!(result.unwrap(), expected);
}

// 2. 絶対にSome/Okであることが保証されている場合
let num: i32 = "42".parse().unwrap(); // 固定文字列のパース

// 3. プロトタイピング(後でちゃんと処理する前提)
let data = fetch_data().unwrap(); // TODO: エラー処理

関連エラー

関連エラー

Rust の他のエラー

最終更新: 2025-12-17