Javaプログラミング 入門編
上から下へ、全 109 枚そのまま並べています。
発表モードで開くJava基礎
Javaプログラミング 入門編
基礎から例外処理まで完全網羅
目次(前半)
全体の流れ
1. イントロダクション
2. 開発環境とコンパイル
3. 変数とデータ型
4. 数値計算と文字列連結
5. 制御構造(if・while・for・switch)
6. 条件式と論理演算
目次(後半)
全体の流れ
7. 配列
8. メソッド
9. 式と値・データ型変換
10. デバッグ
11. 例外処理
Java基礎 - イントロダクション
イントロダクション
Javaの世界へようこそ
Javaとは
Oracle社が開発・配布する代表的なプログラミング言語です。
1995年に登場した、汎用性とオブジェクト指向を特徴とするプログラミング言語。エンタープライズ開発で広く使われている。
・汎用性:Web、業務系、Android、組み込みなど幅広い
・オブジェクト指向:大規模開発に向いた設計思想
・開発環境の充実:Eclipse、IntelliJ などツールが豊富
・Write Once, Run Anywhere の思想
Javaプログラム実行の仕組み
Javaは「中間言語+仮想マシン」の方式で動作します。
プログラマーが書くJavaの文法に従ったテキストファイル
javacコンパイラがJavaVMの理解できる中間言語にコンパイル
JavaVMがCPUに合わせた機械語に変換して実行。同じクラスファイルがどのOSでも動く
コンパイラ方式とインタプリタ方式
プログラミング言語の実行方式は大きく2つに分かれます。Javaはハイブリッド型です。
コンパイラ方式
- 事前にすべてを翻訳
- 実行が速い
- OS依存の実行ファイルが生成
- 代表例:C / C++
インタプリタ方式
- 逐次解釈しながら実行
- 書いたらすぐ試せる
- 同じコードが複数OSで動く
- 代表例:Python / PHP
プログラミング言語の人気度(参考)
Javaは長年トップクラスの人気を維持しています。
出典: TIOBE Index 2025年データをもとに作成(概算)
学びを実りあるものにする5つの心構え
プログラミング学習を効果的に進める姿勢です。
- 達成すべきゴールを明確に
- 章ごとの到達点を確認
- 講師やスクリーンに目を向ける
- 図解と一緒に理解する
- 丸暗記しない
- なぜそうなるかを問う
- 疑問を放置しない
- 他の受講者にも相談
Javaプログラムの構造
・Javaのプログラムは「クラス」が単位。最初に実行されるmainメソッドから始まります。
// ファイル名: Add.java
class Add {
public static void main(String[] args) {
// 変数の宣言と代入
int a = 1;
int b = 2;
int ans;
// a と b を足した結果を ans に代入
ans = a + b;
System.out.println(ans); // 3
}
}クイズ
Javaの基本的な仕組みを確認しましょう。
Javaが「Write Once, Run Anywhere」を実現できる理由はどれですか?
クイズ 解答
Javaが「Write Once, Run Anywhere」を実現できる理由はどれですか?
クラスファイル(中間言語)はOSに依存しません。各OSのJavaVMが、その環境に合わせた機械語へ変換することで「一度書けばどこでも動く」が実現されます。
Java基礎 - 開発環境
開発環境とコンパイル
はじめてのプログラムを動かそう
プログラムが動くまでの流れ
Javaプログラムは3ステップで動きます。
コマンドラインでのコンパイルと実行
・javacでコンパイル、javaで実行。Add.javaの例です。
# 1. ファイルを保存したフォルダに移動
> cd C:\Java
# 2. コンパイル(成功すると Add.class が生成される)
> javac Add.java -encoding utf-8
# 3. 実行(拡張子を除いたクラス名を指定)
> java Add
3Javaの開発環境
Javaの代表的な統合開発環境(IDE)です。
- 無料で広く使われる
- Javaに強い
- この研修で使用
- JetBrains社製
- 補完が強力
- 商用版とCommunity版
- 軽量で多言語対応
- 拡張機能でJava対応
- 設定の自由度が高い
- Apache財団管理
- GUI開発もしやすい
- 古くから定番
Java研修の標準環境
本講座で使用する開発環境のバージョンです。
Java(JDK)
Java 17
LTS(長期サポート)版
Eclipse
2024-12 (4.34.0)
配布Eclipse使用
コンパイラ準拠レベル
17
環境設定で17を指定
文字エンコーディング
UTF-8
ソースの文字コード
コメントの書き方
コメントはコンパイル時に無視されます。コードの意図を補足するために使います。
- // 行コメント:行末までがコメント
- /* … */ ブロックコメント:複数行に対応
- /** … */ Javadocコメント:APIドキュメント生成用
- コメントは「なぜ」を書く。「何をしているか」は読めばわかる
- 変更時は古いコメントを残さず更新する
クイズ
Javaのコンパイルと実行を確認しましょう。
Add.java をコンパイルして実行する正しいコマンドの組み合わせはどれですか?
クイズ 解答
Add.java をコンパイルして実行する正しいコマンドの組み合わせはどれですか?
javacで.javaファイルをコンパイルしてクラスファイルを生成し、javaコマンドで(拡張子なしの)クラス名を指定して実行します。
Java基礎 - 変数とデータ型
変数とデータ型
データに名前をつけて使う
変数とは
変数は「データを保存するためのメモリ領域に名前をつけたもの」です。
扱うデータをメモリに保存するための名前付きの領域。データ型を決めて宣言してから使う。
・宣言:変数名とデータ型を決める
・代入:変数に値を入れる(= は等号ではなく代入)
・参照:変数の値を利用する
・Javaは静的型付け言語。事前に型を決める必要がある
入門編で扱うデータ型
Javaの基本的なデータ型です。Stringだけ頭が大文字なので注意。
int
整数
-1, 0, 1, 100
double
実数(小数)
0.3, 1.0, 3.14
String
文字列
"こんにちは", "山田太郎"
boolean
真偽値
true / false(Yes/Noではない)
変数の宣言・代入・参照
・宣言と代入は1行にまとめて書けます。型に応じた値を代入します。
public class Variables {
public static void main(String[] args) {
// 宣言だけ
int num1;
double num2;
// 代入(型に応じた値)
num1 = 10;
num2 = 3.1416;
// 1文で宣言と代入(初期化)
String name = "山田太郎";
// 参照(変数の中身を表示)
System.out.println(num1); // 10
System.out.println(num2); // 3.1416
System.out.println(name); // 山田太郎
}
}基本データ型一覧
Javaの基本データ型は8種類。整数型・実数型・真偽値・文字型に分類されます。
変数の初期化
初期化とは「最初の値の代入」のこと。Javaでは未初期化のローカル変数を使うとエラーになります。
- 初期化=1度目の代入。2回目以降は単に「代入」
- ローカル変数は初期化しないと使えない(コンパイルエラー)
- Eclipseは未初期化変数に警告を表示してくれる
- int x = 0; のように宣言と同時に初期値を設定するのが一般的
- クラスのフィールドは型ごとのデフォルト値(int → 0、boolean → false)で初期化される
定数(final)
・finalキーワードを付けると、一度代入したら変更できない「定数」になります。
// 定数の宣言(命名規約:すべて大文字、単語間は _ で区切る)
final int BIT_PER_1_BYTE = 8; // 1バイトあたりのビット数
final int AGE_NONCHARGE = 6; // 入場料無料の年齢
final double MANAGER_BASE_SALARY = 400000; // 管理職の基準給与
final String WELCOME_MESSAGE = "こんにちは!";
// 再代入しようとするとコンパイルエラー
// AGE_NONCHARGE = 7; // ← エラー!定数を使うメリット
値をハードコーディングせず、定数で管理する3つの利点。
- 1箇所変えれば全体に反映
- 変更漏れが減る
- 値が変わらないと保証できる
- 読み手の思考負荷を下げる
- 命名で意図を伝えられる
- 数字の意味がコードから読める
クイズ
変数とデータ型の理解を確認しましょう。
次のうち、Javaの構文として正しい変数宣言はどれですか?
クイズ 解答
次のうち、Javaの構文として正しい変数宣言はどれですか?
String name = "山田"; が正しいJavaの構文です。なお double price = 100; もJavaでは合法(自動型変換が働く)ですが、入門段階では明示的に 100.0 と書くのが推奨されます。
Java基礎 - 数値計算
数値計算と文字列連結
値を計算する・つなげる
算術演算子
Javaの基本的な計算演算子です。
+
加算
9 + 3
12
-
減算
9 - 3
6
*
乗算
9 * 3
27
/
除算
9 / 3
3
%
剰余(余り)
100 % 3
1
四則演算と優先順位
・乗除算は加減算より優先。括弧で優先順位を変えられます。
int x = 9;
int y = 3;
int z;
z = x + y; // 12
z = x - y; // 6
z = x * 2; // 18
z = 100 % 3; // 1(あまり)
// 優先順位:乗除算が先
z = y * 100 + x * 10; // 300 + 90 = 390
z = y * (100 + x) * (10 + z); // 括弧で優先順位を制御
// 整数同士の割り算は切り捨て
int result = 7 / 2; // 3 ではなく 3(小数部切り捨て)複合代入演算子
変数自身への計算と代入を1つの演算子で書けます。
+=
加算代入
x += 2
x = x + 2
-=
減算代入
x -= 2
x = x - 2
*=
乗算代入
x *= 2
x = x * 2
/=
除算代入
x /= 2
x = x / 2
%=
剰余代入
x %= 2
x = x % 2
インクリメント・デクリメント
・値を1増やす(++)/1減らす(--)演算子。ループのカウンタでよく使います。
int i = 0;
// インクリメント
i++; // i = i + 1 と同じ → i は 1
++i; // 同じく i = i + 1 → i は 2
// デクリメント
i--; // i = i - 1 → i は 1
--i; // i = i - 1 → i は 0
// for ループでよく使う
for (int j = 0; j < 10; j++) {
System.out.println(j);
}文字列の連結
・+ 演算子は数値の加算だけでなく、文字列の連結にも使えます。文字列と数値の + は文字列として連結されます。
String f = "Yamada";
String l = "Taro";
int y = 23;
System.out.print("私の名前は");
System.out.print(f + l); // YamadaTaro
System.out.println("です。");
// 文字列と数値の混在連結
System.out.println(l + " " + f + " is " + y + " years old.");
// 結果: Taro Yamada is 23 years old.ユーザー入力の受け取り(Scanner)
・java.util.Scanner クラスでキーボード入力を受け取ります。整数なら nextInt()、文字列なら next() を使います。
import java.util.Scanner;
public class Greet {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("あなたの年齢を入力してください: ");
int age = scan.nextInt();
System.out.print("あなたの名前を入力してください: ");
String name = scan.next();
System.out.println(name + "さんは" + age + "歳ですね。");
}
}クイズ
算術演算の理解を確認しましょう。
int a = 7; int b = 2; のとき、System.out.println(a / b); の出力はどれ?
クイズ 解答
int a = 7; int b = 2; のとき、System.out.println(a / b); の出力はどれ?
int同士の割り算は結果もint型で、小数部は切り捨てられます。3.5を得たい場合は、どちらかをdouble型にする必要があります(例: a / 2.0)。
Java基礎 - 制御構造
制御構造
if・while・for・switch で処理を制御する
3つの基本制御構造
どんなに複雑なプログラムも、この3つの組み合わせで作れます。
- 上から下に処理を実行
- Javaでは特別な構文不要
- 条件によって処理を分ける
- if 文 / switch 文
- 条件を満たす間処理を繰り返す
- while 文 / for 文
比較演算子
条件式で使う比較演算子です。結果は boolean 型(true / false)になります。
==
等しい
age == 20
!=
等しくない
age != 20
<
より小さい
age < 20
>
より大きい
age > 20
<=
以下
age <= 20
>=
以上
age >= 20
if 文の基本
・条件が true のときだけブロック内を実行します。else でその他の処理を書けます。
// 条件成立時のみ実行
if (age >= 60) {
System.out.println("当館のシルバー割引が適用されます。");
}
// 二択の分岐
if (age >= 20) {
System.out.println("成年料金は ¥2,000 円となります");
} else {
System.out.println("未成年料金は ¥1,200 円となります");
}else if で多段階の分岐
・条件が3つ以上のときは else if を使います。最初に一致したブロックだけが実行されます。
int score = 75;
if (score >= 80) {
System.out.println("優");
} else if (score >= 60) {
System.out.println("良");
} else if (score >= 40) {
System.out.println("可");
} else {
System.out.println("不可");
}switch 文
・特定の値に応じて多肢選択するときに使います。break を忘れると次のcaseに流れる「フォールスルー」が起きます。
int a = 2;
switch (a) {
case 1:
System.out.println("a は 1 です");
break;
case 2:
System.out.println("a は 2 です");
break;
case 3:
System.out.println("a は 3 です");
break;
default:
System.out.println("入力エラー");
}
// String型もswitch可能(Java 7以降)
String bloodType = "A";
switch (bloodType) {
case "A": case "a":
System.out.println("日本人の約40%"); break;
case "O": case "o":
System.out.println("日本人の約30%"); break;
}while 文
・条件式が成立する間、処理を繰り返します。回数が決まっていないループに向きます。
// 1から100までの合計を計算
int num = 0;
int sum = 0;
while (num < 100) {
num = num + 1;
sum = sum + num;
}
System.out.println("答えは:" + sum); // 5050
// 別パターン: ans を2倍ずつ100以下になる間繰り返す
int ans = 3;
while (ans <= 100) {
System.out.println(ans);
ans = ans * 2;
}for 文
・決まった回数の繰り返しに向く構文。「初期値・条件式・更新式」を1行にまとめます。
// 2の8乗を求める
int ans = 1;
for (int i = 1; i <= 8; i++) {
ans = ans * 2;
}
System.out.println(ans); // 256
// 九九(二重ループ)
for (int x = 1; x <= 9; x++) {
for (int y = 1; y <= 9; y++) {
System.out.print(x * y + " ");
}
System.out.println(); // 行末で改行
}break と continue
・ループの途中で抜けたい・スキップしたいときに使う2つの文。
break(脱出)
- ループ自体を終了する
- それ以降は実行されない
- 多重ループでは最も内側だけ抜ける
- 条件達成で打ち切る用途
continue(次の周回へ)
- 残りの処理をスキップ
- ループの先頭に戻る
- ループ自体は継続する
- 特定条件だけ飛ばしたいときに使う
break の使用例
・-1 が入力されたら合計の集計を打ち切る例。
Scanner scan = new Scanner(System.in);
int sum = 0;
for (int i = 0; i < 10; i++) {
System.out.print("数値を入力(-1で終了): ");
int input = scan.nextInt();
if (input == -1) {
break; // ループを抜ける
}
sum = sum + input;
}
System.out.println("合計は: " + sum);ブロックとスコープ
変数の有効範囲は、宣言したブロック { } の中だけ。範囲を抜けると消滅します。
- 変数は宣言したブロック内でのみ有効
- ブロックを抜けると変数は破棄される
- 別のブロックなら同じ名前の変数を宣言できる
- 上位ブロックで宣言した変数は、内側のブロックでも参照できる
- 上位の変数と同名のローカル変数を内側に宣言するとコンパイルエラー
- スコープは「使う直前で宣言」「使うブロック内で宣言」が原則
クイズ
制御構造の理解を確認しましょう。
for (int i = 0; i < 5; i++) { ... } で変数 i に入る値はどれ?
クイズ 解答
for (int i = 0; i < 5; i++) { ... } で変数 i に入る値はどれ?
i = 0 から始まり、i < 5 が成立する間(つまり i = 4 まで)繰り返されるので、 0, 1, 2, 3, 4 の5つの値になります。
Java基礎 - 条件式
条件式と論理演算
複合条件・短絡評価・フラグ
条件式と boolean 型
・条件式の結果は boolean 型。変数に格納したり、別の条件で再利用できます。
int totalAmount = 12000;
// 比較結果を boolean 変数に格納
boolean isOver10000 = totalAmount >= 10000;
boolean isExactly10000 = totalAmount == 10000;
// boolean 変数を if の条件として使える
if (isOver10000) {
System.out.println("合計額は 10000 以上です");
} else {
System.out.println("合計額は 10000 未満です");
}文字列の比較は equals メソッド
・文字列の一致判定に == を使うのは誤り。Javaでは String の equals メソッドを使います。
String prefName = "東京";
// 誤った書き方(参照の比較になる)
if (prefName == "東京") { // ← NG
System.out.println("一致");
}
// 正しい書き方(中身の比較)
if (prefName.equals("東京")) { // OK
System.out.println("一致");
}
// 否定(東京でない)
if (!prefName.equals("東京")) {
System.out.println("東京以外");
}論理演算子
複数の条件を組み合わせるための演算子。
- 両方が true のときだけ true
- english >= 70 && math >= 70
- どちらか一方が true なら true
- total >= 220 || hasBonus
- 真偽を反転させる
- !isFinished
複合条件の例
・&& と || を組み合わせて、複雑な条件を1つの if で書けます。
int english = 75;
int math = 80;
// 英語と数学の両方が70点以上なら合格
if (english >= 70 && math >= 70) {
System.out.println("おめでとう!合格です");
} else {
System.out.println("残念!不合格です");
}
// && は || より優先される。複雑なときは括弧で明示
if ((english >= 70 && math >= 70)
|| (english + math >= 160)) {
System.out.println("合格基準を満たしています");
}演算子の優先順位
複数の演算子が並んだとき、優先度の高いものから評価されます。
高
式(括弧)
( )
単項
! ++ --
乗除剰余
* / %
加減
+ -
比較
< <= > >=
等価
== !=
論理積
&&
論理和
||
低
代入
=
短絡評価(ショートサーキット)
論理演算では、結果が確定した時点で残りの式は評価されません。エラーの回避にも使えます。
- && の場合:左が false なら式全体が false 確定 → 右は評価しない
- || の場合:左が true なら式全体が true 確定 → 右は評価しない
- b != 0 && (a / b > 1) は b == 0 でもエラーにならない
- obj != null && obj.method() のように null チェックでよく使う
- 副作用のある式(メソッド呼び出し)を右に置くと「実行されない」ことが起きる
フラグ変数
・複雑な条件判定の途中経過を boolean 変数に保存し、可読性を高めるテクニック。
int english = 75, math = 65, japanese = 80;
boolean isSuccess = false;
// 条件①: 全科目70点以上
if (english >= 70 && math >= 70 && japanese >= 70) {
isSuccess = true;
}
// 条件②: 合計220点以上 かつ 全科目50点以上
if (english + math + japanese >= 220) {
if (english >= 50 && math >= 50 && japanese >= 50) {
isSuccess = true;
}
}
// フラグで最終判定
if (isSuccess) {
System.out.println("おめでとう!合格です。");
} else {
System.out.println("残念!不合格");
}クイズ
文字列比較の理解を確認しましょう。
文字列 s が "END" と等しいかを判定する正しい書き方はどれですか?
クイズ 解答
文字列 s が "END" と等しいかを判定する正しい書き方はどれですか?
文字列の中身を比較するには equals メソッドを使います。== は参照(オブジェクトの同一性)の比較になり、意図と異なる結果になることがあります。
Java基礎 - 配列
配列
同じ型のデータをまとめて扱う
配列とは
配列は「同じデータ型の値を、まとめて1つの変数で扱う」しくみです。
連続した領域に同じ型の値を並べたデータ構造。要素番号(添字)でアクセスする。
・要素はすべて同じ型
・要素数は宣言時に決め、後から変更不可
・添字(index)は 0 から始まる
・最後の要素の添字は length - 1
配列の宣言と作成
・型名[] 配列名; で宣言し、new 型名[要素数] で領域を確保します。
// 宣言と要素確保を別々に
int[] row1;
row1 = new int[3]; // int 型 3要素
double[] row2;
row2 = new double[2]; // double 型 2要素
// 1文で宣言と確保
int[] row3 = new int[3];
// 初期値をまとめて設定
int[] scores = {80, 75, 91};
String[] names = {"太郎", "次郎"};配列要素への代入と参照
・添字([] の中の番号)で個別の要素にアクセスします。添字は0から始まる点に注意。
int[] row1 = new int[3];
row1[0] = 10; // 1つ目
row1[1] = 20; // 2つ目
row1[2] = 30; // 3つ目(最後)
// 参照
System.out.println(row1[0]); // 10
System.out.println(row1[1] + row1[2]); // 50
// 文字列配列も同様
String[] name = {"太郎", "次郎"};
System.out.println(name[0] + "と" + name[1] + "は兄弟");配列の要素数(length)
・配列名.length で要素数を取得できます。ハードコーディングを避けて保守性を高めます。
int[] array = {3, 4, 9, 0, 1, 6};
int sum = 0;
// 要素数を直接書く(保守性が低い)
for (int i = 0; i < 6; i++) {
sum += array[i];
}
// length を使う(要素数が変わっても修正不要)
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
// 拡張 for 文(より簡潔)
for (int v : array) {
sum += v;
}
System.out.println("合計値: " + sum);2次元配列
・行と列の2方向に拡張した配列。表のようなデータを表現できます。
// 2次元配列の宣言と確保
int[][] a = new int[2][3]; // 2行3列
// 値の代入
a[0][0] = 1; a[0][1] = 2; a[0][2] = 3;
a[1][0] = 4; a[1][1] = 5; a[1][2] = 6;
System.out.println(a[1][1]); // 5
// 九九の表を2次元配列で構築
int[][] kuku = new int[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
kuku[i][j] = (i + 1) * (j + 1);
}
}クイズ
配列の理解を確認しましょう。
int[] arr = {10, 20, 30, 40, 50}; のとき arr[2] の値はどれ?
クイズ 解答
int[] arr = {10, 20, 30, 40, 50}; のとき arr[2] の値はどれ?
配列の添字は 0 から始まるので、arr[0]=10, arr[1]=20, arr[2]=30 となります。
Java基礎 - メソッド
メソッド
処理をまとめて再利用する
メソッドとは
メソッドは「処理のかたまりに名前を付けて呼び出せるようにしたもの」。他言語の「関数」「サブルーチン」に相当します。
引数を受け取り、処理を実行し、戻り値を返す再利用可能な処理のかたまり。Javaではすべて何らかのクラスに属する。
・main メソッドは特別。プログラム起動時に最初に呼ばれる
・main 以外は別のメソッドから呼び出されない限り実行されない
・メソッド内で宣言した変数(ローカル変数)は他のメソッドから参照できない
・引数と戻り値で値を受け渡しする
メソッドの呼び出し
main メソッドが他のメソッドを呼び出す流れ。
sayHello() のようにメソッド名を書いて呼び出す
開始から終了までの処理を実行
呼び出し先の処理が終わると、呼び出し元の次の行から処理が再開する
メソッドの定義と呼び出し
・修飾子・戻り値の型・メソッド名・引数・処理本体で構成されます。
public class TryMethod {
public static void main(String[] args) {
sayHello(); // 呼び出し
sayHello(); // 何度でも呼べる
}
// メソッド定義
static void sayHello() {
System.out.println("Hello, I am ...");
}
}
// 出力:
// Hello, I am ...
// Hello, I am ...引数と戻り値
・引数で値を渡し、return で結果を返します。宣言文の戻り値の型と return 値の型を一致させること。
public class CalcSushi {
public static void main(String[] args) {
int amount = amountByPrice(3, 100); // 引数: 枚数, 単価
System.out.println("会計: " + amount + "円"); // 300円
}
// 皿別金額計算メソッド
static int amountByPrice(int number, int price) {
int amount = number * price;
return amount; // 戻り値
}
}戻り値がないメソッド(void)
・値を返さないメソッドは戻り値の型を void にします。return; でメソッドを途中終了できます。
static void sayHello(int age) {
if (age < 20) {
System.out.println("若いですね!");
return; // 途中で抜ける
}
System.out.println("もうそんなに若くないですね!");
// void なので return 文は省略可
}
// 引数なし・戻り値なし
static void greet() {
System.out.println("こんにちは");
}複数の引数
・引数は順番で対応するため、呼び出し時の値の順序が重要です。
public static void main(String[] args) {
int japanese = 75, english = 65, math = 70;
tryNextGrade(japanese, english, math, false);
tryNextGrade(japanese, english, math, true);
}
static void tryNextGrade(int nationalLanguage, int english,
int mathematics, boolean submitReport) {
// レポート未提出なら国語を10点減点
if (!submitReport) {
nationalLanguage = nationalLanguage - 10;
}
if (nationalLanguage + english + mathematics >= 210) {
System.out.println("進級できます。");
} else {
System.out.println("進級できません。");
}
}オーバーロード
・同じ名前で引数の型・個数・順序が異なるメソッドを定義できます。これを「オーバーロード」と呼びます。
public class TryOverload {
// ① int 2つを引数に取る
static double calcBMI(int height, int weight) {
return weight / ((height / 100.0) * (height / 100.0));
}
// ② double 2つを引数に取る(① とは別メソッド扱い)
static double calcBMI(double height, double weight) {
return weight / ((height / 100.0) * (height / 100.0));
}
// 引数を省略したい場合の利用例
static void sayHello(String name) {
sayHello(name, false); // デフォルトは日本語
}
static void sayHello(String name, boolean inEnglish) {
if (inEnglish) System.out.println("Hello, " + name);
else System.out.println("こんにちは、" + name);
}
}プログラムの引数(コマンドライン引数)
main メソッドの String[] args は、プログラム起動時に外部から受け取る値です。
- public static void main(String[] args) の args が引数
- 起動: java MainArgs suzuki 22 SE → args = {"suzuki", "22", "SE"}
- args.length で引数の数を取得できる
- 数値として使うには Integer.parseInt(args[0]) などで変換
- Eclipseでは「実行構成」のArgumentsタブで設定できる
クイズ
オーバーロードの理解を確認しましょう。
次の calcArea メソッドのうち、すでに static int calcArea(int w, int h) が存在するクラスにオーバーロードとして追加できるのはどれ?
クイズ 解答
次の calcArea メソッドのうち、すでに static int calcArea(int w, int h) が存在するクラスにオーバーロードとして追加できるのはどれ?
オーバーロードはメソッド名と引数の型・個数・順序(シグネチャ)で区別されます。引数名は無関係。引数の個数や型が異なる static int calcArea(int side) はOK。戻り値の型だけ違うのはNGです。
Java基礎 - 型変換
式と値・データ型変換
型同士の変換とキャスト
式と値の評価順序
複雑な式も、演算子の優先順位に従って1つずつ処理されているだけです。
- 演算子の優先順位の高い順に評価
- メソッドの引数に別のメソッドを書くと、内側から評価される
- add(add(a, b), c) → まず add(a, b) → その結果と c で add
- 条件式の && / || は短絡評価され、左から順に評価
- 複雑な式は中間変数に分けると読みやすくなる
自動型変換とキャスト
異なるデータ型同士で値を代入する2つの方法。
自動型変換(暗黙)
- 範囲が小さい → 大きい型へ
- int → double(情報を失わない)
- コードに何も書かなくてOK
- double d = 10; // OK
キャスト(明示)
- 範囲が大きい → 小さい型へ
- double → int(情報損失あり)
- (型名) で明示する
- int i = (int) 3.14; // 3
型変換の例
・自動型変換とキャストを使い分けます。
int i1;
double d1 = 1.0;
// i1 = d1; // ❌ コンパイルエラー(double → int)
double d2;
int i2 = 1;
d2 = i2; // ✅ 自動型変換(int → double)
int i3;
double d3 = 1.0;
i3 = (int) d3; // ✅ キャストで明示的に変換
// 整数型同士の割り算は切り捨て
int a = 5, b = 2;
System.out.println(a / b); // 2
double c = (double) a / b;
System.out.println(c); // 2.5基本データ型の範囲
小さい範囲から大きい範囲への変換は自動。逆方向はキャストが必要です。
byte
-128 〜 127
小さい整数
short
-32,768 〜 32,767
中規模整数
int
約 ±21億
通常の整数
long
約 ±922京
大きな整数
float
単精度 約7桁
軽量な実数
double
倍精度 約15桁
通常の実数
文字列を数値に変換(parseInt)
・String と数値型はキャストできません。専用メソッドを使います。
String s = "120";
// int i = (int) s; // ❌ キャスト不可
int i = Integer.parseInt(s); // ✅ 文字列 → int
System.out.println(i); // 120
System.out.println(i * 2); // 240(数値として計算可)
// 数値化できない場合は実行時エラー(NumberFormatException)
// Integer.parseInt("abc"); // ← 実行時にエラー
// double 用は Double.parseDouble
double d = Double.parseDouble("3.14");計算結果のデータ型
・計算は引数の型の組み合わせで結果型が決まります。
int a = 5, b = 2;
System.out.println(a / b); // 2 (int / int → int で切り捨て)
double c = a / b;
System.out.println(c); // 2.0 (右辺が int / int = 2、自動でdoubleに)
double c2 = (double) a / b;
System.out.println(c2); // 2.5 (double / int → double)
System.out.println(5.0 / 2); // 2.5 (double / int → double)
System.out.println(5 / 2.0); // 2.5 (int / double → double)クイズ
型変換の理解を確認しましょう。
int x = 7; double y = x / 2; のとき、y の値はどれ?
クイズ 解答
int x = 7; double y = x / 2; のとき、y の値はどれ?
右辺は int / int = 3(切り捨て)が先に評価され、その後 double に自動変換されて 3.0 が代入されます。3.5 を得たい場合は (double) x / 2 のように書く必要があります。
Java基礎 - デバッグ
デバッグ
プログラムの動きを追跡する
デバッグとは
デバッグはプログラムの問題を特定し修正する作業、またはそのためにプログラムをトレースする手段を指します。
プログラムのバグ(不具合)を見つけて修正する一連の作業。トレース手法を使ってプログラムの実行を追いかける。
・バグ=プログラムの不具合や想定外の動作
・コードを書いた直後に何らかのバグがあるのは当然
・効率的にデバッグできる人は開発も速い
・Eclipseのデバッグ機能で実行を追跡できる
Eclipseのデバッグ機能
Eclipseには強力なデバッグ機能が搭載されています。
- プログラムを一時停止する位置
- 行番号の左端をダブルクリック
- 複数設定できる
- 1行ずつ実行
- F6 キー(ステップオーバー)
- F5 でメソッド内に入る
- 次のブレークポイントまで進む
- F8 キー
- なければ最後まで実行
- 停止中に変数の値を確認
- 変数ビューで表示
- 変化した値は黄色で強調
古典的なデバッグ手法(println)
・デバッガが使えない場面では、System.out.println で値や経路を表示する方法も使われます。
int year = 2024;
System.out.println("入力された年: " + year); // 値の確認
boolean isLeapYear = false;
if (year % 4 == 0) {
System.out.println("通過: 4で割って余らない"); // 経路の確認
if (year % 100 == 0) {
System.out.println("通過: 100で割って余らない");
if (year % 400 == 0) {
isLeapYear = true;
}
} else {
isLeapYear = true;
}
}
System.out.println("うるう年判定: " + isLeapYear);デバッグ実行の流れ
Eclipseでブレークポイントを使ったデバッグの基本フロー。
条件付きブレークポイント
ブレークポイントに条件を設定して、特定の状況だけで止められます。
- ブレークポイントを右クリック → ブレークポイントプロパティーを開く
- ヒットカウント:N回目に到達したときだけ停止(ループ中に有効)
- 条件付き:式が true のときだけ停止(例: ans > 100)
- 大量のループの中の異常値だけを捕まえるのに有用
- 「最後の1回だけ」「異常値のときだけ」など範囲を絞れる
クイズ
Eclipseのデバッグ機能を確認しましょう。
プログラムが一時停止しているとき、F8 キーを押すとどうなる?
クイズ 解答
プログラムが一時停止しているとき、F8 キーを押すとどうなる?
F8 は「再開」。次のブレークポイントまで一気に進みます。次がなければプログラムは最後まで実行されて終了します。F6 は1行ずつのステップ実行です。
Java基礎 - 例外処理
例外処理
エラーに強いプログラムを書く
例外とは
例外は、プログラム実行中に発生する例外的な事象を表すしくみです。
実行中に予期しない事態が起きたときに発生するオブジェクト。適切に処理しなければプログラムは停止する。
・ハードウェア障害など想定外のシステム障害
・ファイルが存在しない、形式が不正などの前提条件違反
・ゼロ除算・配列範囲外などコード上のミス
・try / catch で安全に対処できる
例外発生の例(ゼロ除算)
・分母に0を入力すると ArithmeticException が発生してプログラムが停止します。
Scanner scan = new Scanner(System.in);
System.out.print("分子を入力してください: ");
int a = scan.nextInt();
System.out.print("分母を入力してください: ");
int b = scan.nextInt();
int result = a / b; // b = 0 のとき例外発生!
System.out.println("結果: " + result);
// 実行結果(b=0 のとき):
// Exception in thread "main" java.lang.ArithmeticException: / by zero
// at ...try / catch / finally
・例外を捕まえる構文。tryで監視、catchで対処、finallyで必ず実行。
try {
Scanner scan = new Scanner(System.in);
System.out.print("分子: ");
int a = scan.nextInt();
System.out.print("分母: ");
int b = scan.nextInt();
int result = a / b; // 例外が起きうる処理
System.out.println("結果: " + result);
}
catch (Exception e) {
// 例外が発生したときの処理
System.out.println("0で割り算を行うことはできません。");
}
finally {
// 例外の有無に関わらず必ず実行
System.out.println("プログラムを終了します。");
}例外処理の実行の流れ
例外が発生した場合・しない場合の処理経路。
主要な例外クラス
Exception の下は、宣言が要らない RuntimeException 系と、必ず処理が要る検査例外に分かれます。
よく出会う例外と原因
入門段階で発生しやすい例外と、そのよくある原因です。
ArithmeticException
ゼロ除算 (a / 0)
分母を事前にチェック
ArrayIndexOutOfBoundsException
配列の範囲外アクセス
arr.length と比較してから操作
NumberFormatException
"abc" を parseInt に渡した
try-catch で囲む / 入力検証
NullPointerException
null のオブジェクトに .method() を呼んだ
null チェックする
エラーメッセージの読み方
・実行時エラーは赤字で表示されます。3つのポイントを押さえれば原因に辿り着けます。
// 出力例:
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
// Index 10 out of bounds for length 10
// at TryAibe.main(TryAibe.java:18)
// ① 例外クラス名: ArrayIndexOutOfBoundsException
// → 「配列の範囲外」を意味する
// ② 詳細メッセージ: Index 10 out of bounds for length 10
// → 添字10は長さ10の配列の範囲外(添字は0〜9まで)
// ③ 発生箇所: TryAibe.java の 18行目, mainメソッド
// → コードの該当行を確認する
// よくあるバグ: for (int i = 0; i <= arr.length; i++) ← i < arr.length が正クイズ
例外処理の理解を確認しましょう。
try / catch / finally 構文で、例外が発生してもしなくても必ず実行されるブロックはどれ?
クイズ 解答
try / catch / finally 構文で、例外が発生してもしなくても必ず実行されるブロックはどれ?
finally ブロックは例外の有無にかかわらず必ず実行されます。リソースの解放(ファイルクローズなど)の処理によく使われます。catch は例外が発生した場合のみ実行されます。
基本文法・制御構造・配列・メソッド・例外処理。Javaの土台がそろいました。次はオブジェクト指向で「クラス」の世界へ。
— Javaプログラミング 入門編 完結