プログラミング言語を整える
初級Java を整える。
= 業務システムの研修で多く使われる Java を、同じお題で読んで学ぶ
Java が初めての方は、先に そもそも Java とは・どんな場面で使うか をどうぞ。
Javaとは
クラスを単位に書くオブジェクト指向の言語で、日本では業務システムの開発で長く使われています。
| 誕生 | 1995年 |
|---|---|
| 作った人・組織 | Sun Microsystems(James Gosling ら)。現在は Oracle が開発を主導しています |
| 型の付け方 | 静的型付け |
| 動かし方 | javac でバイトコード(.class)にコンパイルし、JVM(Java仮想マシン)の上で実行する |
| ファイルの拡張子 | .java |
| 手元で動かすには | javac Main.java && java Main |
日本での使われ方
- SIer が受託開発する企業の業務システムで、広く使われています。
- 金融機関や官公庁のシステムでも、Java で作られたものが多くあります。
- Web アプリケーションのバックエンド(サーバー側)では、Spring Framework(Spring Boot)と組み合わせて使われることが多いです。
- Android アプリは以前は Java で書くのが主流でした。現在は Google が Kotlin を推奨しています。
新人研修での位置づけ
Java は、SIer の新人研修でよく使われる言語の1つです。クラスやインターフェースといったオブジェクト指向の考え方をそのまま学べることと、型を厳しく確かめるため間違いをコンパイルの段階で見つけやすいことが理由に挙げられます。研修のあとに配属される業務システムの現場でも Java が使われていることが多く、学んだことをそのまま仕事に持ち込めます。
関わる資格・試験
- Oracle Certified Java Programmer, Bronze SE(入門向け)
- Oracle Certified Java Programmer, Silver SE 11 / Silver SE 17
- Oracle Certified Java Programmer, Gold SE 11 / Gold SE 17
- 基本情報技術者試験(以前の午後試験では、Java がプログラミング言語の選択肢の1つでした)
そもそも Java とは
一度書けば、いろいろな機械で動く。業務システムの定番言語。
Javaは、1995年に Sun Microsystems が発表した言語で、James Gosling らが開発しました。ソースコードを javac でバイトコード(.class)に変換し、JVM(Java仮想マシン)の上で実行します。OS ごとの違いを JVM が受け持つので、同じプログラムを Windows でも Linux でも動かせます。
データと処理を「クラス」という単位にまとめて書くオブジェクト指向の言語で、変数には型を指定します。名前が似ている JavaScript とは別の言語です。書き方は C# とよく似ています。
どこで・どんな場面で使うか
-
企業の業務システム
SIer が受託開発する、販売・在庫・会計などの業務システムで広く使われています。
-
金融機関や官公庁のシステム
長く運用されるシステムが多く、Java で作られたものが数多くあります。
-
Web アプリのサーバー側
Spring Framework(Spring Boot)と組み合わせて、Web サービスの裏側を作るのに使われることが多いです。
-
Android アプリ
Android アプリの開発でも、長く使われてきた言語です。
-
求人・研修での位置づけ
業務システム開発の求人で挙がることが多く、SIer の新人研修でも取り上げられます。
なぜ覚えておくと得か
- 仕事の選択肢が広がる。業務システム開発では、今も Java の経験を求める募集があります。
- ほかの言語に応用しやすい。クラスや型といった、多くの言語に共通する考え方を学べます。C# など書き方の近い言語にも移りやすくなります。
- 資料や事例が豊富。長く使われてきた言語なので、書籍・解説・既存のコードが多く、つまずいたときに調べやすいです。
Java の資格(Oracle 認定)の試験範囲と練習問題は、Java Bronze を整えるとJava Silver を整えるにあります。
下のお題とクイズで、Java のコードがどう動くかを手で追って確かめてみてください。
5つのお題をJavaで書く
C・C++・Java・C#・COBOL・VBA の6ページで、同じ5つのお題を同じ順に並べています。言語を切り替えると、書き方の違いがそのまま比べられます。
このページではコードを実行できません。表示している出力とエラーのメッセージは、OpenJDK 21.0.12.1 で実際にコンパイル・実行して、一字一句同じになることを確かめたものです。
コード(.java)
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
実行すると
Hello, World!
Java では、短いプログラムでもクラスの中に main メソッドを書きます。public class の名前とファイル名(Main.java)は同じにする決まりです。
コード(.java)
public class Main {
public static void main(String[] args) {
for (int i = 1; i <= 15; i++) {
if (i % 15 == 0) {
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
}
実行すると
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz
for 文や if 文の書き方は C 言語とほぼ同じです。System.out.println は、数値でも文字列でもそのまま受け取って表示できます。
コード(.java)
public class Main {
public static void main(String[] args) {
int[] nums = {3, 1, 4, 1, 5, 9, 2, 6};
int sum = 0;
for (int n : nums) {
sum += n;
}
double avg = (double) sum / nums.length;
System.out.println("合計: " + sum);
System.out.println("平均: " + String.format("%.2f", avg));
}
}
実行すると
合計: 31 平均: 3.88
配列は自分の長さを nums.length で持っています。int どうしの割り算は小数が切り捨てられるため、(double) で型を変えてから割ります。
コード(.java)
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
Path path = Path.of("memo.txt");
Files.writeString(path, "1行目: りんご\n2行目: みかん\n");
List<String> lines = Files.readAllLines(path);
for (String line : lines) {
System.out.println(line);
}
}
}
実行すると
1行目: りんご 2行目: みかん
Files.writeString と Files.readAllLines を使うと、ファイルの読み書きを短く書けます。ファイル操作は IOException を投げることがあるため、throws IOException を書くか try-catch で受け止める必要があります。
コード(.java)
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
int c = a / b;
System.out.println(c);
} catch (ArithmeticException e) {
System.out.println("エラー: " + e.getMessage());
}
System.out.println("処理を続けます");
}
}
実行すると
エラー: / by zero 処理を続けます
整数を 0 で割ると ArithmeticException という例外が起きます。try-catch で受け止めれば、プログラムを止めずに続きの処理へ進めます。
出力当てクイズ
コードを読んで、画面に出るものを選んでください。選ぶと正解と理由が出ます(答えはどこにも送られず、記録もしません)。
問1
public class Main {
public static void main(String[] args) {
String a = "hi";
String b = new String("hi");
System.out.println((a == b) + " " + a.equals(b));
}
}
画面に出るのは?
== は「同じオブジェクトかどうか」を比べ、equals は「中身の文字が同じかどうか」を比べます。new String で作った b は a とは別のオブジェクトなので == は false、中身は同じなので equals は true です。
問2
public class Main {
public static void main(String[] args) {
System.out.println(7 / 2);
}
}
画面に出るのは?
int どうしの割り算の結果は int になり、小数点以下は切り捨てられます。3.5 を得たいときは 7.0 / 2 のように片方を double にします。
問3
public class Main {
public static void main(String[] args) {
int i = 5;
int a = i++;
int b = ++i;
System.out.println(a + " " + b + " " + i);
}
}
画面に出るのは?
i++ は「今の値を使ってから 1 増やす」ので a は 5 で、i は 6 になります。++i は「1 増やしてから使う」ので i が 7 になり、b も 7 です。
問4
public class Main {
public static void main(String[] args) {
System.out.println('A' + 1);
}
}
画面に出るのは?
char の 'A' は文字コード 65 を表す数値として扱われ、int の 1 と足すと int の 66 になります。文字の B を表示したいときは (char) ('A' + 1) のように char に戻します。
よくあるエラーと直し方
初めて書く人が出会いやすいエラーです。メッセージは英語のまま出ることが多いので、どの言葉を手がかりにすればよいかもあわせて載せています。
実行時 NullPointerException
エラーになるコード
public class Main {
static String name;
public static void main(String[] args) {
System.out.println(name.length());
}
}
画面に出るメッセージ(抜粋)
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "Main.name" is null
何が起きているか:変数 name に値を入れていないため、中身は null(何も指していない状態)です。null に対してメソッドを呼び出したので、実行中に止まりました。
直し方:使う前に name = "totonoe"; のように値を入れます。null になりうる場合は、if (name != null) で確かめてから呼び出します。
実行時 ArrayIndexOutOfBoundsException
エラーになるコード
public class Main {
public static void main(String[] args) {
int[] nums = {1, 2, 3};
System.out.println(nums[5]);
}
}
画面に出るメッセージ(抜粋)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
何が起きているか:要素が3つの配列で使える番号は 0〜2 です。存在しない 5 番を読もうとしたため、実行中に止まりました。
直し方:番号が 0 以上 nums.length 未満に収まっているかを確かめます。全要素を順に読むなら for (int n : nums) を使うと番号の書き間違いを避けられます。
コンパイル時 ';' expected(セミコロンの書き忘れ)
エラーになるコード
public class Main {
public static void main(String[] args) {
System.out.println("Hello")
}
}
画面に出るメッセージ(抜粋)
Main.java:3: error: ';' expected
何が起きているか:文の終わりに付けるセミコロン(;)が抜けているため、コンパイルの段階で止まりました。
直し方:エラーに出た行(ここでは3行目)の文の終わりに ; を付けます。
コンパイル時 incompatible types(型が合わない)
エラーになるコード
public class Main {
public static void main(String[] args) {
int n = "123";
System.out.println(n);
}
}
画面に出るメッセージ(抜粋)
Main.java:3: error: incompatible types: String cannot be converted to int
何が起きているか:int 型の変数に String 型の値("123")を入れようとしたため、コンパイルの段階で止まりました。Java は型が合わない代入を許しません。
直し方:数値として使うなら int n = 123; と書きます。文字列を数値に変えたいときは Integer.parseInt("123") を使います。
ほかの言語の解説
- C言語 1972年・静的型付け
- C++ 1983年(1979年に「C with Classes」として開発が始まりました)・静的型付け
- C# 2000年(発表)・静的型付け
- COBOL 1959年・静的型付け(PIC 句で桁数と種類を宣言する)
- VBA 1993年(Excel 5.0 に搭載)・型を宣言しなくても動きます(Variant 型になる)。Option Explicit を書くと変数の宣言を強制できます
6言語の並べての比較は プログラミング言語を整える にあります。 書いたコードはどこにも送られません(このページに入力欄はクイズの選択だけで、選んだ答えも記録しません)。
このツールについて
クラスを単位に書くオブジェクト指向の言語で、日本では業務システムの開発で長く使われています。
Java の概要と、同じ5つのお題・出力当てクイズ・よくあるエラー(NullPointerException など)。出力は OpenJDK で確かめたもの。
主な機能
- 概要(誕生・作った人・型・動かし方)と日本での使われ方・新人研修・資格
- 5つのお題のコード例(C・C++・C#・COBOL・VBA の同じお題へ移れる)
- 出力当てクイズ4問(== と equals・整数の割り算など)
- よくあるエラー4件(javac・JVM の実際のメッセージ・原因・直し方)
- 出力は OpenJDK 21 で照合済み・送信ゼロ
よくある質問
Q. このページで Java のコードを実行できますか?
A. できません。解説だけのページです。表示している出力とエラーのメッセージは、OpenJDK 21 で実際にコンパイル・実行して確かめたものです。
Q. 文字列の比較で == を使うと何が問題ですか?
A. == は「同じオブジェクトか」を比べるため、中身が同じ文字列でも false になることがあります。中身を比べるときは equals を使います。出力当てクイズの1問目で確かめられます。
Q. Java の資格にはどんなものがありますか?
A. Oracle 認定の Java 資格(Bronze・Silver・Gold)があります。ページの「関わる資格・試験」に、確認できた名前を載せています。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。
続けて整える
この内容は、研修でも扱っています
totonoe.tech を運営する株式会社Koinobori は、法人向けの研修サービス「NOBORIBA®」も運営しています。 ここで手を動かした内容を、講師から教わる形の研修です。このページの道具は無料のまま、登録もいりません。