Java経験者がPHPでハマる10選の5 「例外処理の違い」
こんにちは。ゆうせいです。
Javaをしっかり学んだ人がPHPに移行すると、「似てるはずなのに全然感覚が違う!」と驚くことが多いんです。
同じオブジェクト指向言語ですが、設計思想や実行環境、型の扱い方などがかなり異なります。
Java経験者がPHPを学ぶときにハマりやすいポイントを10個にまとめ、具体的な解説と回避方法をお伝えしています。
5つ目「例外処理の違い」を掘り下げます。
例外処理の違い
JavaとPHPはどちらもtry / catchを使って例外処理をしますが、「何が例外になるか」「例外の扱い方」「強制性」が大きく異なります。
Java経験者がPHPに移行すると、「エラーなのに例外にならない!」という現象に戸惑うことが多いです。
JavaとPHPの比較表
| 項目 | Java | PHP |
|---|---|---|
| 例外の分類 | Checked Exception / Unchecked Exception | Exception / Error(PHP7以降) |
| 発生タイミング | コンパイル時にチェックされる場合あり | 実行時のみ |
| 強制性 | Checked Exceptionはthrows宣言とtry-catch必須 | 例外は必須ではない(エラーを無視可能) |
| エラー種別 | ほぼすべて例外化 | 警告(Warning)、通知(Notice)は例外化されない |
サンプルコードでの違い
Java(強制される例外処理)
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}
}
FileNotFoundExceptionは Checked Exception → コンパイル時にthrowsかtry-catch必須
PHP(例外にならないケース)
$content = file_get_contents("file.txt");
// ファイルがなければ Warning だが例外にはならない
PHPで例外に変える方法
PHPではデフォルトでは警告やエラーは例外にならないため、手動で例外化する必要があります。
方法1:set_error_handler() を使う
set_error_handler(function($errno, $errstr) {
throw new ErrorException($errstr, $errno);
});
方法2:例外を投げる関数を自作
if (!file_exists("file.txt")) {
throw new Exception("File not found");
}
エラーの階層(PHP7以降)
Throwable
├── Exception
│ ├── LogicException
│ ├── RuntimeException
│ ...
└── Error
├── TypeError
├── ParseError
├── ...
JavaではThrowable配下にExceptionとErrorがある構造に似ていますが、PHPは後からこの構造を取り入れたため、まだ関数ごとの仕様が統一されていません。
イメージで理解する
- Java:交通ルールが厳しく、信号を守らないと出発できない(コンパイルエラー)
- PHP:信号はあるけど、無視しても走れる。ただし事故ったら自己責任
実務での推奨
- 必要ならエラーを例外に変換して統一的に扱う
- ライブラリやフレームワーク(Laravel, Symfonyなど)はほぼ例外ベースなので、それに合わせる
try-catchだけでなくfinallyで後処理を確実に書く
Javaは道路に必ずゲートがあるが、PHPはほぼフリーパスという違いです。
次は6つ目「null安全性の甘さ」に進めると、実行時の意図しないエラー回避の考え方が見えてきます。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年10月26日Pythonのimport完全ガイド!パッケージとモジュールの階層構造をスッキリ理解しよう
山崎講師2025年10月26日Python関数の引数の罠!正しい順番をマスターしてエラーを回避しよう
山崎講師2025年10月26日Pythonの「浅いコピー」と「深いコピー」の違いとは?コピーの罠を徹底解説!
山崎講師2025年10月26日VSCodeを自分好みに育てる!新人エンジニアのためのsettings.json徹底ガイド