はじめに
今更の題材ですが、練習がてら初投稿してみます。
※そもそも投稿者自身が投稿初心者かつ初投稿なので色々荒があるのはご容赦ください。
なんなら、現時点でMarkdownについて調べながら書いています。
「何かしら問題があって動作しないことは分かるが、英語で色々出てどうしたら良いか分からない」
という方向けです。
(タイトルの通り例としてJavaで記述しています)
コンパイラ、インタプリタ、スクリプト等々
言語や環境によってエラーメッセージやタイミングが異なる等の
様々な要素がありますが今回は全て無視します。
本題
ようやく本題ですが、
例として以下の四則演算を実行するシンプルなプログラムがあったとします。
なお、想定通り実行できない例を2つ「例1」、「例2」として記載します。
例題コード(シンプルに四則演算をするプログラム)
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("足し算の結果");
addition(4, 2);
System.out.println("引き算の結果");
subtraction(4, 2);
System.out.println("掛け算の結果");
multiplication(4, 2);
System.out.println("割り算の結果");
division(4, 2);
}
// (1)足し算
public static void addition(int num1, int num2) {
System.out.println(num1 + num2);
}
// (2)引き算
public static void subtraction(int num1, int num2) {
System.out.println(num1 - num2);
}
// (3)掛け算
public static void multiplication(int num1, int num2) {
System.out.println(num1 * num2);
}
// (4)割り算
public static void division(int num1, int num2) {
System.out.println(num1 / num2);
}
}
想定する実行結果
足し算結果
6
引き算結果
2
掛け算結果
8
割り算結果
2
以下から想定通り実行できない例を記述します。
例1:(1)にint以外を渡してしまった…
…省略
System.out.println("足し算結果");
addition(4, 2.0);
…省略
エラーメッセージ
Main.java:6: error: incompatible types: possible lossy conversion from double to int
addition(4, 2.0);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
出ました、「ヒヤッ」とする瞬間ですね。
落ち着いて上から軽く確認してみましょう。
解決に向けて(「Note:~」等、一部省略)
- どこでですか?
- Main.java:6(Mainの6行目ですよ)
- どんな理由ですか?
- incompatible types(互換性がありませんよ)
- 解決法はありますか?
- possible lossy conversion from double to int(非可逆になるけど、doubleからintへの変換が可能ですよ)
- ↑ 変数の型変換に関わる部分なので意味については今回は記述しません。
- コードではどこの部分に問題があるのですか?
- addition(4, 2.0) => 丁寧に「^」で指定されている箇所です。
注意点
解説のために上から読みましたが、実際は下から読むことが多いです。
コードが複雑になればなるほど、出てくるエラー量・情報は煩雑になります。
ですが、「だいたいこんな風に読むんだな」とイメージしておきましょう。
オススメの手順(と気を付けるべき点)
とりあえず、エラーメッセージをサイト等を利用して翻訳してみる。
翻訳した個別のメッセージで検索してみる。
その言語特有のポイントがあれば「公式ドキュメント」で調べてみる。
どうしても理解できなければ個人の記事等を読んでみる。
↑の場合、情報が「本当に正確」なのか精査する。
「なんとなくできた」ではなくおおよそで良いから内容を理解してみる。
次の例に向けて
ここから2つ目のエラー例を記述しますが、
「例1」のエラーと気色が異なる(厳密には例外と呼ばれる)ものなので
「もう例1でお腹いっぱい」という方はゆっくり寝て頭を整理しましょう。無理は禁物です。
(※Exceptionという単語が出てきますが「例外」という意味です、ザックリ「エラーが出た」くらいの認識で大丈夫です。)
例2:(4)で0の割り算をしてしまった…(0除算と呼ばれるもの)
…省略
System.out.println("割り算結果");
division(4, 0);
…省略
エラーメッセージ
比較のために「例2」と「例1」を並べてみます。
// 例2
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.division(Main.java:32)
at Main.main(Main.java:12)
// 例1
Main.java:6: error: incompatible types: possible lossy conversion from double to int
addition(4, 2.0);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error
恐らく、多くの人が目にするのは「例2」形式の方でしょう。
「例1」と同じく、上から軽く確認してみましょう。
解決に向けて
-
どんなエラーですか?
- java.lang.ArithmeticExceptionが発生しました。
-
どんな理由ですか?
- 「/ by zero」(0の除算)によってです。
-
どこで発生したエラーですか?
- [注意点1] 2行目の"at"以降には、最終的にどこでエラーが発生したのかが表示されます。
- この場合はMain.javaの32行目です。(at Main.division(Main.java:32))
- [注意点2] 3行目以降も"at"が続き、どこでエラーが発生したのかが表示されます。(at Main.main(Main.java:12))
- 2行目は実際にエラーが発生した場所ですが、3行目以降はエラーが発生したメソッドを呼び出した場所が表示されます。
- [注意点1] 2行目の"at"以降には、最終的にどこでエラーが発生したのかが表示されます。
-
要約すると…
- コレも下から順に読みましょう。
- at Main.main(Main.java:12) => Mainクラスの12行目でメソッドを呼び出しましたね。
- at Main.division(Main.java:32) => 呼び出したMainクラスのdivisionメソッドでエラーが発生しましたよ。
- Exception in thread "main" java.lang.ArithmeticException: / by zero
=> java.lang.ArithmeticExceptionという例外が発生しましたよ。(0除算によってね。)
-
今回の場合は理由が直に書いてありますが…
- 実際はエラーの理由までは書いてないことがあるので、「 java.lang.ArithmeticException」 ってなんだろう… みたいになった場合は以下のドキュメントなどを駆使して調べてみましょう。
- 公式ドキュメント Java SE8 docs
- ArithmeticExceptionについて
おわりに
長くなってしまったうえに引き際を見失った感がありますが、
自分が最初に「エラー」というものに遭遇して
「なんだか全く分からないし怖い」状況から脱するために実践した手順が
上記ですので、誰かの参考になれば幸いです。
思いつきの勢いで記述したので細かい部分については色々と見逃してください。
(後から見直して編集する可能性があります。)