Pythonの「あのエラー」はJavaの「アレ」だった!新人エンジニア向けエラー対応付けガイド
こんにちは。ゆうせいです。
プログラミングの学習を始めたばかりのとき、あるいは新しい言語に挑戦しているとき、赤い文字で表示されるエラーメッセージは心臓に悪いですよね。特に、複数の言語を行き来していると、「このエラー、前の言語だと何に相当するんだっけ?」と混乱してしまうこともあるでしょう。
今回は、特に新人エンジニアの方が触れる機会の多いPythonとJavaに焦点を当て、Pythonの代表的なエラーがJavaの例外とどう対応するのかを、わかりやすい例えと共に解説していきます。これを読めば、エラーへの恐怖心が少し和らぐはずですよ!
準備はいいですか?それでは、見ていきましょう!
A. NameError:名前が見つからない!
まずはNameError
からです。これはPythonで非常によく見かけるエラーの一つですね。
Python
print(my_variable)
これを実行すると、my_variable
なんて変数はどこにも定義していないので、Pythonに「そんな名前の変数は知らないよ!」と怒られてしまいます。これがNameError
です。
例えるなら…
これは、友達の家に遊びに行って、そこにいない別の子の名前を大声で呼ぶようなものです。「え、誰…?」と、みんなが困惑してしまいますよね。プログラムの世界でも、宣言(紹介)されていない変数をいきなり使おうとすると、コンピュータは「誰のこと?」となってしまうのです。
Javaではどうなる?
Javaは静的型付け言語なので、このようなエラーの多くはプログラムを実行する前、つまりコンパイルの段階で発見されます。
Java
public class Main {
public static void main(String[] args) {
System.out.println(myVariable); // myVariableを宣言していない
}
}
このJavaコードをコンパイルしようとすると、「記号が見つかりません(cannot find symbol)」というエラーが出て、実行ファイルを作ることすらできません。
つまり、PythonのNameError
は、Javaにおけるコンパイルエラーに非常に近い感覚だと言えます。Javaの方が、パーティが始まる前に名簿をチェックしてくれる、しっかり者の幹事さんのようなイメージでしょうか。
B. TypeError:型が違うよ!
次にご紹介するのはTypeError
です。これは、データ型が異なるもの同士で、無理な操作をしようとしたときに発生します。
Python
result = 5 + "apple"
数字の5
と文字列の"apple"
を足し算しようとしていますね。コンピュータは「数字と文字をどうやって足せばいいんだ…?」と混乱してTypeError
を出します。
例えるなら…
これは、「体重(kg)」と「身長(cm)」を足し算しようとするようなものです。単位も概念も違うので、足した結果の数字に意味がありませんよね。プログラムもそれと同じで、意味をなさない計算はできないのです。
Javaではどうなる?
Javaでも、コンパイル時に同様のエラーが見つかります。
Java
int result = 5 + "apple"; // コンパイルエラーになる
Javaは型に厳格なので、「int
型の変数に、int
とString
を足したものを入れようとしているけど、それはダメだよ」とコンパイルの段階で教えてくれます。
しかし、実行時に発生するエラーで似ているものにClassCastException
があります。これは、あるオブジェクトを、互換性のない別の型に無理やり変換(キャスト)しようとしたときに発生します。
PythonのTypeError
は、Javaのコンパイル時の型不一致エラーや、実行時の**ClassCastException
**の考え方に近いものだと捉えておくと良いでしょう。
C. ValueError:値が不適切だよ!
TypeError
と少し似ていますが、ValueError
は「データ型は合っているけど、その中身(値)が適切じゃない」という場合に発生します。
Python
number = int("apple")
int()
という関数は、文字列を整数に変換するためのものです。引数が文字列であるという点では型は合っています。しかし、その中身が"apple"
では、数字に変換しようがありません。ここで発生するのがValueError
です。
例えるなら…
自動販売機に、お金ではないただの丸い金属片を入れるようなものです。自動販売機は「硬貨」という型を期待していますが、投入されたものの「価値(value)」が不正なため、受け付けてくれないわけですね。
Javaではどうなる?
これはJavaの例外と非常によく対応しています。NumberFormatException
がまさにそれです。
Java
int number = Integer.parseInt("apple");
このコードを実行すると、JavaはNumberFormatException
という例外をスローします。これは「数字のフォーマットじゃないよ!」という、とても分かりやすい名前ですね。より広い意味ではIllegalArgumentException
(不正な引数例外)の一種と考えることもできます。
PythonのValueError
は、Javaの**NumberFormatException
やIllegalArgumentException
**に相当すると覚えてください!
D. SyntaxError:文法が間違っている!
最後に紹介するのはSyntaxError
です。これは、Pythonの文法ルールを破ってしまったときに発生する、最も初歩的なエラーです。
Python
print("Hello, world!"
このコードでは、最後の閉じ括弧)
が抜けていますね。人間が見れば意図は分かりますが、コンピュータは厳格です。文法的に正しくないコードは解釈できず、SyntaxError
となります。
例えるなら…
これは、日本語の「てにをは」を間違えたり、句読点を忘れたりするのと同じです。「私はご飯を食べます」を「私ご飯を食べる」と書くようなもので、意味は通じるかもしれませんが、正しい文章ではありません。プログラムの世界では、この「少しの間違い」が許されないのです。
Javaではどうなる?
これもNameError
と同様に、Javaではコンパイルエラーとして扱われます。
Java
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!") // セミコロンを忘れている
}
}
Javaでは文の最後にセミコロン;
が必要ですが、もし忘れてしまうとコンパイラが「;
がありません」とエラーを出し、実行ファイルは作成されません。
PythonのSyntaxError
は、コードを実行する前にPythonのインタプリタがチェックしてくれる点で、Javaのコンパイルエラーと全く同じ役割を果たしています。
まとめと次のステップ
いかがでしたか?PythonのエラーとJavaの例外を対応付けてみました。
NameError
: Javaのコンパイルエラー(未宣言の変数)に相当。TypeError
: Javaのコンパイルエラー(型の不一致)やClassCastException
に相当。ValueError
: JavaのNumberFormatException
やIllegalArgumentException
に相当。SyntaxError
: Javaのコンパイルエラー(文法ミス)に相当。
こうして見ると、言語の仕組み(動的型付けか静的型付けか)によってエラーが出るタイミングは異なりますが、エラーが発生する根本的な原因は共通していることが多い、ということが分かりますよね。
エラーメッセージを読むのは、最初は辛いかもしれません。しかし、それはプログラムがあなたに送ってくれている重要なヒントなのです。
これからは、エラーが出たらすぐに検索するのではなく、「これはどういう種類のエラーだろう?」「Javaだったら、どの例外に近いかな?」と一瞬考えてみてください。この一手間が、あなたのプログラミング能力をより一層深めてくれるはずです。エラーと仲良くなって、一歩上のエンジニアを目指しましょう!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。