コンパイルエラー:
Compile-Error. コンパイルが解釈不可能な状態.
実行時エラー:
Runtime-Error. 実行時にクラッシュしたり実行結果がおかしい場合.
です。
コンパイルエラーは、コンパイルが解釈するときに「??? 何言ってんの?」ってなる状態。
例えばJavaでもC++でもそうだけど、型が厳格な言語で、
としたら、a = 10 の行で「コンパイルエラー」を吐く。
人間からすると変数ってこともわかるし、10を代入していることから整数系( int, long 等 ) だろうと想定できる。
しかし、コンパイラは定義された方法以外では解釈できない。
人間の私たちが宇宙人語(ある・ないはともかく)を理解できますか?
これイコールこれと定義付ける必要があるでしょ?
それと一緒。
だから、「aっていう変数? よくわからんがそんなもん、ないよ?」と怒られる。
これがコンパイルエラー。つまり、for文の書き方とか変数宣言していないとかのような、解釈そのものができない状態に出る。
実行時エラーは、コンパイルは通る(= 構文は正しい )が、意味的におかしい場合です。
例えばテストの点数を数学・国語・理科・社会・英語の順番に入力して、合格/不合格 を表示するプログラムだとして、
なおかつ、
合格 : 70%以上
不合格: 合格基準を満たしていない場合
とした場合、本来なら80%あるとしたら、70%以上に該当するから "合格"が印字されるはず。
でも実際には"不合格"となっていたりする。
この場合は、構文的には正しいけど、if文での 大なり・小なりとかのやつがおかしかったりする。
合格: 70%以上
とするなら、
// int pers にパーセンテージの数字が入っているとして
if( pers >= 70 ){
// 合格
}
とするところを、
// int pers にパーセンテージの数字が入っているとして
if( pers <= 70 ){
// 合格
}
// => "pers が 70以下のとき" と解釈される
という風に意味が違う。
あと、C++, Javaとかの例外処理が備わっている言語だと、
例外エラーもある。
これはどっちにはいるのかわからんが、メッセージに
"Exception" とか "例外" っていう字が入っている。
NullPointerException (いわゆる"ぬるぽ") とか。
ここまでが基礎。
で、質問を読むと、
Q1. 実行時エラー?
Java
1public class Sample1_1_3 {
2public void main(String[] args) {
3System.out.println("Hello!");
4}
5}
となっている。
確かにコンパイルは通るはず。
でも実行ができない。
これは知識不足によるものですね。
なぜコンパイルが通るのか。
それは「普通のクラスと解釈された」から。
普通のクラスでも一応mainメソッドを持つことは可能だと思う。
でも、Javaはclassファイルそのものが動いているのではなくて、
Java.exe っていうソフト ( JDKやユーザ向けのJAVAに入っているやつ ) が解釈します。
根拠は、
C言語でコマンドライン引数と呼ばれるものを受け取る場合、
bat
1rem main.exe が実行ファイルだとして
2main -a -b -f=file1.jpg
のような感じになる。
ではJavaだとどうなるか。
bat
1rem Main.class がメインメソッドがあるクラスファイルだとして
2java Main -a -b -f=file1.jpg
となる。
Java.exe に Main.class を渡して、それと -a -b ... とかも渡す。
という状態。
だから、曲を書く人が音符のやつ書いて、それを指揮者とか楽器演奏者に渡してやってもらう。
みたいな状態。
で、話を戻して、
Java.exe が 渡されたクラスやJarファイルを参照して処理する。
だからmainメソッドから開始するけど、
決められた書き方以外では認識できない。
だからエラー。
これが実行時に行われているから"実行時エラー".
二つ目のやつは、voidがないって...これはコンパイルが解釈できない。
必ず メソッドは型を持つ。
それを定義しないから、変数宣言がないとか、ありもしないメソッドを使おうとしている...みたいな感じのエラーになる。( エラー理由が違うが、「解釈できない」っていう意味では同じ。 )
まずは基礎部分から理解しましょう。