Javaの勉強をはじめて4ヶ月。Oracle Java Bronzeの勉強をはじめて、1ヶ月。
Oracle Java Bronzeなんて国内でしか通用しない資格だし、取ったところで初心者だって言ってるようなもんだ、取るならSilverを目指せ!とよく聞きますが、Java Bronzeめちゃくちゃ難しくないですか?もっと評価されてもいい資格だと思います。
Bronzeとって満足するなってことですかね。
と、目標をBronzeに定め勉強していますが、未だに問題集を解いても合格点までいきません。
凡ミスがなくなれば合格点にも届きそう、簡単なことなのに忘れてしまう、あとちょっとのところで間違えてしまう、私がよく間違える問題を集めてみました。
mainクラスなど省略して書いている問題もあります。
問題 1
public class Main {
public static void main(String[] args) throws Exception {
final double d = 6;
int [] ary = new int[6];
for( int i = 0 ; i < d ; i++){
ary[i] = i;
}
d = 1.23;
System.out.println( d + ” : ” + ary[3]);
}
}
A : 1.23 : 2 と表示される
B : 1.23 : 3 と表示される
C : 6.0 : 3 と表示される
D : コンパイルエラーになる
E : 実行時エラーになる
答え
D : コンパイルエラーになる が正解です。
解説のようなもの
final double d = 6;でdoubleを「final」で 6 を代入しているので、他の数値を後から代入することができないのでコンパイルエラーになります。
final double d = 6;の「final」を見落として間違えることがよくあります。問題が複雑になるにつれ見落とすことが増えていきます。
問題 2
実行するとどうなるか?
for( int i = 0 ; i++ < 5 ; ){
System.out.print( i + ” ” );
}
A : 0 1 2 3 4 と表示される
B : 0 1 2 3 4 5 と表示される
C : 1 2 3 4 5 と表示される
D : 1 2 3 4 と表示される
E : 何も表示されない
F : コンパイルエラーになる
答え
C : 1 2 3 4 5 と表示される が正解です。
解説のようなもの
for文(ループ)と演算子の問題です。
演算子は ++i で判定前に足す、 i++ で判定後に足します。
for文は「 初期化式 ; 条件式 ; 継続式 」をかっこ内に書くのですが、省略可能です。1つ省略しても3つすべて省略しても問題ありません。
//すべて省略ver
int i = 0;
for( ; ; ){
if( i < 5){
i++;
System.out.print( i + ” ” );
}
}
for文は「 初期化式 ; 条件式 ; 継続式 」で成り立っていると思っていいたのに、一つでも消えてしまったら成り立つの?という疑問にやられてループの処理をきちんと考えられなくなる嫌な問題です。
しかも判定後に足されるi++も、for文ではループしたあとに計算するクセがついてしまって処理の後に足して間違えました。条件式にi++がある場合は条件判定したのちに足されるのでややこしいです。
問題 3
コンパイルに成功するものはどれか (複数選択可)
A : String s = ‘Hello world’;
B : char c = ‘0055’;
C : int i = ‘y’;
D : short sh = 32768;
E : double d = 2.34;
F : float f = 5.67;
G : boolean b = “true”;
答え
C と E がコンパイルに成功します。
解説のようなもの
全部コンパイルできるようにするとこんな感じです。
String s = “Hello world”;
char c = ‘\u0055’; // U
int i = ‘y’; // 121
short sh = 32767;
double d = 2.34;
float f = 5.67f;
boolean b = true;
int で文字が数値になる不思議にいつもだまされます。
文字の対応に興味があるかたは下記を参考にしてみてください。
参考サイト:https://ja.wikipedia.org/wiki/ASCII
charもuなくても入るんだっけと思ってしまったり。
float型に代入する時は「数値F」という形にしなければいけません。これもうっかり忘れます。
今の所問題としてみたことはありませんがlong型も「数値L」というように代入しますが、int型の範囲以内であれば「数値」だけでも代入できます。
またbyteやshortなどの値の範囲は覚えておかないと答えられない問題も出るようです。
問題 4
実行するとどうなるか?
int a = 5;
int b = 5;
if(a < b){
System.out.print(“A”);
}else if(a > b){
System.out.print(“B”);
}else if(a = 5)
System.out.print(“C”);
A : A と表示される
B : B と表示される
C : C と表示される
D : コンパイルエラーになる
E : 実行時エラーになる
答え
D : コンパイルエラー が正解です。
解説のようなもの
上記のコードだと「型の不一致: int から boolean には変換できません。」と言われてしまいます。
理由は「 A = B」 はBをAに代入するという代入する式であり「true」、「false」を返さないからです。
「A == B」で AはBに等しいかを比較する式になります。
わかっていても、いざ問題を解いているとパッと見でA = Bに気づかなくてよく間違えます。
問題 5
実行するとどうなるか?
String [] tvDrama = {“逃げ恥”, “あな番”, “半沢”, “踊る”, “ミタ”};
int i = 0;
for( ; i <= tvDrama.length; i++){
System.out.print(tvDrama[i] + ” : “);
}
A : 逃げ恥 : あな番 : 半沢 : 踊る : ミタ : と表示される
B : 逃げ恥 : あな番 : 半沢 : 踊る : と表示される
C : あな番 : 半沢 : 踊る : ミタ : と表示される
D : コンパイルエラーになる
E : 実行時エラーになる
答え
E : 実行時エラーになる が正解です。
解説のようなもの
なんだかおかしいエラーになるとわかっていてもコンパイルエラーな気がして間違えてしまいます。たまにlengthってどこから数えたらいいのかもわからなくなります。
コンパイルエラーは文法がおかしいときに起こります。
例えば変数のデータ型を宣言し忘れる場合とか。
今回は文法的にはあっているけれど、実行時にtvDrama[5]を呼ばれてしまい、tvDrama[5]には値がないため実行時エラーとなります。
問題 6
実行するとどうなるか?
int a = 10;
int b = 2;
if(a != 10){
a = b;
}else if(a == 10 || b > 5){
a /= 2;
b++;
}else
b += a;
b += 2;
System.out.println(a + ” ” + b);
A : 5 5 と表示される
B : 5 3 と表示される
C : 10 14 と表示される
D : 2 2 と表示される
E : 2 4 と表示される
F : コンパイルエラーになる
答え
A : 5 5 と表示される が正解です。
解説のようなもの
計算や条件式の集中しすぎて、最後のelseに”{ }” (波括弧)がないことを見落としてよく間違えます。
“{ }”がないときのif文ははじめの1行しか実行されません。
問題 7
実行するとどうなるか?
int x = 1;
if(x == 1){
int y = 5;
x = y++;
}
System.out.print(x + ” : ” + y);
A : 1 5 と表示される
B : 5 6 と表示される
C : 6 6 と表示される
D : 1 6 と表示される
E : コンパイルエラーになる
答え
E : コンパイルエラーになる が正解です。
解説のようなもの
スコープの問題です。
int y を if 文の中で宣言しているので、if文の外側では使えません。
問題を解くのに集中していて、うっかりスコープを見逃します。
あとがき
ちょっと勉強したくらいでいい点は取れるもんでもないと思いますが受験前に解いて、凡ミスに気づきやすくなればと思います。
ひっかけみたいな問題ありすぎです。