Java 初級編:読めれば十分
AIがコードを書く時代になりました。ChatGPTやGitHub Copilotに「〇〇の処理を書いて」と頼めば、数秒で動くJavaコードが出てきます。ゼロからコードを暗記して書く必要は、以前よりずっと少なくなっています。
ではエンジニアに何が残るのか。「このコードは何をしているのか」を読んで理解する力です。AIが出力したコードをレビューし、バグを見つけ、意図通りに動くかを判断する。それが人間の役割になっています。
このシリーズの学び方
「Javaを学ぶ」と聞くと、文法を1から覚えて何かを書けるようになることをイメージするかもしれません。このシリーズが目指すのはそこではありません。このJava初級編は、コードを書くためではなく、コードを読むために設計しています。各ページでは次の流れで進みます。
- 実際のコードを見る
- キーワードや構文の意味を日本語で読み解く
- 「このコードは何をしているか」を言葉にできるようになる
AIが生成したJavaコードを見て「これはユーザー情報を取得してリストに格納している」「この条件を満たさないとエラーになる」といった読み解きができるようになります。書けなくても、読めれば設計の議論に参加できます。
Javaとはどんな言語か
AIに「Javaで作って」と頼む前に、そもそもJavaがどんな性格の言語なのかを知っておくと、出てきたコードへの見方が変わります。
Javaは1995年に登場した、企業の業務システムやAndroidアプリに広く使われるプログラミング言語です。現在はOracle社が開発を主導しています。
最大の特徴は JVM(Java Virtual Machine) という仕組みです。Javaで書かれたコードは一度コンパイルされ、JVMという仮想マシン上で動きます。JVMさえあればWindowsでもMacでもLinuxでも同じコードが動く——これが「Write Once, Run Anywhere(一度書けばどこでも動く)」という有名なキャッチコピーの意味です。
// Javaコードがどう動くか
[ソースコード (.java)] → コンパイル → [バイトコード (.class)] → JVM → 実行
Javaが使われている場所
Javaは特に大規模な業務システムで多く使われています。銀行のシステム、ECサイトのバックエンド、製造業の基幹システムなど、社会インフラを支えるソフトウェアに多く採用されています。SIer(システムインテグレーター)の現場では今もJavaが主力言語のひとつです。
バージョンについて
AIが出したコードをそのまま動かそうとして「動かない」となる原因の多くは、実は文法ミスではなくバージョンの不一致です。まずここを押さえておきましょう。
Javaには6ヶ月ごとにリリースされる短期版と、数年間サポートされるLTS(Long Term Support)版があります。業務システムでは安定性重視でLTS版が使われることがほとんどです。
Java 8 / 11 / 17 / 21 がLTS版です。現在AIが生成するコードの多くはJava 11〜17を前提としています。コードの先頭や設定ファイルにバージョンが書かれていることがあるので、確認する習慣をつけましょう。
クラスとインスタンス——Javaを読む上での最初の壁
AIが生成したJavaコードを開くと、まず class というキーワードが目に飛び込んできます。「クラス」と「インスタンス(オブジェクト)」の違いが分からないと、そこから先が全部霧の中になってしまいます。
ハクスラゲームでたとえると分かりやすくなります。クラスは「武器の設計図」です。「攻撃力〇〇、重さ〇〇、属性は炎」という仕様だけが決まっている段階で、まだ手に持てる実物ではありません。その設計図をもとに実際に1本鍛え上げた剣がインスタンスです。同じ設計図(クラス)から、攻撃力の違う剣を何本でも作れます。
// クラス = 武器の設計図
class Weapon {
String name;
int attack;
Weapon(String name, int attack) {
this.name = name;
this.attack = attack;
}
void show() {
System.out.println(name + "(攻撃力: " + attack + ")");
}
}
// インスタンス = 設計図から実際に鍛えた剣
Weapon sword = new Weapon("業火の剣", 120);
Weapon dagger = new Weapon("風のダガー", 45);
sword.show(); // 業火の剣(攻撃力: 120)
dagger.show(); // 風のダガー(攻撃力: 45)
AIが生成したJavaコードで new Weapon(...) のような記述を見たら、「設計図(クラス)から実物(インスタンス)を1つ作った」瞬間だと読み解きましょう。Weapon という同じ型でも、sword と dagger は別々の実体を持つ、というのがオブジェクト指向の基本の考え方です。
Javaコードによく出てくる構文パターン
AIが書くJavaコードは、書き手が違っても似たパターンの繰り返しになりがちです。よく見る形をいくつか知っておくだけで、初見のコードでも「あ、これはよく見るやつだ」と読めるようになります。
// 条件分岐:レベルによって装備できる武器を変える
int level = 12;
if (level >= 20) {
System.out.println("伝説の剣が装備できます");
} else if (level >= 10) {
System.out.println("鋼の剣が装備できます");
} else {
System.out.println("木の剣しか装備できません");
}
// 繰り返し:手持ちアイテムを全部表示する
List items = List.of("回復薬", "毒消し", "鍵");
for (String item : items) {
System.out.println("所持アイテム: " + item);
}
拡張for文(for (String item : items))は「itemsの中身を1つずつ取り出してitemに入れる」という意味です。items[0]のような添字操作をしなくても全要素を処理できるので、AIが生成するコードでは配列やリストの走査によく使われます。
例外処理——「失敗したときどうするか」を読む
AIが生成したコードには try と catch が頻繁に登場します。これは「うまくいかなかったときの保険」を書いている部分です。
try {
int hp = Integer.parseInt(inputText); // 文字列を数値に変換
player.setHp(hp);
} catch (NumberFormatException e) {
System.out.println("数値として読み取れませんでした: " + inputText);
}
- try
- 「ここでエラーが起きるかもしれない」という処理を囲むブロック
- catch
- tryの中でエラーが起きたときに、代わりに実行される処理。何が起きたときに動くかは括弧内の型(例:
NumberFormatException)で決まる - finally
- エラーの有無にかかわらず必ず実行される処理。ファイルやDB接続の後片付けによく使われる
AIコードでよくあるはまりポイント
実際にAIが出したJavaコードをそのまま動かして、何度も同じところでつまずいた経験があります。ここでは特に遭遇しやすい2つを紹介します。
NullPointerExceptionが出て動かない
AIに簡単な処理を頼むと、変数の中身が空(null)である可能性をチェックしないコードが返ってくることがあります。値が入っているはずの変数が実はnullのまま渡されると、NullPointerExceptionという実行時エラーで処理が止まります。
NullPointerExceptionが出たら、まずスタックトレース(エラーの詳細ログ)の一番上の行を確認し、どの変数がnullだったかを特定します。AIに「このエラーが出ました」とログをそのまま貼って修正を頼むのが、遠回りに見えて一番早い解決策です。
使っているJavaのバージョンとコードが合っていない
AIが新しめの構文(例えば var によるローカル変数の型推論や、テキストブロック)を使ったコードを出してきたのに、手元の環境が古いJavaのままでコンパイルエラーになる、というのもよくある事故です。エラーメッセージに見慣れない構文の名前が出てきたら、AIに使ってよいJavaのバージョンを先に伝えておくと事故を防げます。