プロが教えるわが家の防犯対策術!

あの、以前こちらで質問した者です。→http://okwave.jp/qa/q6482901.html
今、英単語が表示され日本語でそれを答えるクイズを作ろうとしています。
まだまだ作りかけですが、どうしてもコンパイル時にエラーになってしまいます。
どこから直せば良さそうですか?自己研究ということで周りに質問する人がいません。
すみませんがヒントを頂けたらと質問しました。よろしくお願いします。

import java.io.*;

public class EnglishToJapaneseQuiz {

public int MAX_QUESTION = 5;
public int GOODANSWER = 0;

public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("Welcome! This quiz helps you study Japanese in English");
System.out.println("'n' normal");
System.out.println("'h' hard");
System.out.println("'e' expert");
System.out.println("'z' exit");
System.out.println("Please select the level");
String line = reader.readLine();
char c = line.charAt(0);

switch (c) {
case 'n':
System.out.println("You selected normal");
for (int i=0; i<MAX_QUESTION; i++) {
int x = (int)(Math.random() * 10) + 1;
switch (x) {
case 1:
System.out.println("School");
String Answer = "学校";
BufferedReader responce = new BufferedReader(new InputStreamReader(System.in));
String line = responce.readLine();
If (line.equals(Answer)) {
System.out.println("correct");
GOODANSWER = GOODANSWER + 1;
} else {
System.out.println("incorrect");
}
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
}
}
break;

case 'h':
System.out.println("You selected hard");
break;

case 'e':
System.out.println("You selected expert");
break;

case 'z':

break;

default:
System.out.println("you must indicate valid character");
break;
}
} catch (IOException e) {
System.out.println(e);
System.out.println("invalid value");
}
System.out.println("the program was successfully ended");
}
}

A 回答 (1件)

☆コンパイルエラー解消のコツはエラーメッセージをみつつ、1つずつ根気よく潰していくことです。



まず、質問者さんのコードを打ち込んでみました。

http://ideone.com/yA83A

>Main.java:31: ';' expected
If (line.equals(Answer)) {

本来あるべきセミコロンがない、と言っています。
よく見てみるとifであるべきところがIfと書かれています。
コンパイラはこれをユーザーが定義したIfメソッドと解釈、何かを呼び出していると考えたのでしょう。

だから、

If(line.equals(Answer));

という一文だと思っています。セミコロンを付けると、{が余計だ、ときっと言ってくるでしょう。
「if構文」として取れないので、elseをみて「ifがないelseだ」という文句のおまけ付きです。

☆今回のセミコロンの事例のように、本質とはずれた報告のされ方をすることがある。
☆他のエラーが原因で発生するエラーもあって、芋づる式に治ることがある。どれを直せばどれが同時に直るか見極めよう!

直してみます。
==============================
質問者環境ではやらなくていいですが、このサイトはMain.javaというファイル名でコンパイルするのでちょっとクラス名を修正。
改めてコンパイルしなおしたらエラーが新たな出てきやがりました。

http://ideone.com/4GeeJ


簡単そうなところから行きましょう。
Main.java:30: line is already defined in main(java.lang.String[])
String line = responce.readLine();

lineっていう変数は既にmainメソッドで定義されている、という情報を元に、ソースを眺めると、

17行目にありました。ってことで30行目の変数の型を取り払います。
String line = reader.readLine();

http://ideone.com/wv1uU


>non-static variable MAX_QUESTION cannot be referenced from a static context

最後は説明しづらいから残したコイツ。staticでない変数MAX_QUESTIONはstaticなコンテキスト(ここでいうpublic static void main(String[] args))から参照できない、ってことで【暫定的に】

public int MAX_QUESTION = 5;
public int GOODANSWER = 0;



public static int MAX_QUESTION = 5;
public static int GOODANSWER = 0;

と変えてみる。

コンパイルエラーが全て消えた。
http://ideone.com/lOqQ1

#1でそのまま実行してみたけど、例外(実行時エラー)がでたのは何も入力してないからだね。
#2ではupload with new inputからnを入力してみた結果だよ。

===========================================
☆staticってどういうときに使われるか調べてみよう!個人的には今回のような暫定的な対処は良くない気がする。
☆コンパイルエラーや実行時エラーが出ないようにするのは当然として、それ以外にも工夫できるところはいくつもあるよ!
★問題、選択肢、答えをファイルから取り込むようにすればswitch caseは要らないし、問題の改訂ごとにプログラムをコンパイルしなおす苦痛から解放されるよ
#このサイトってファイル作れないんで標準入力を使って検証することになるけど。
☆テストを最初に書いておくとか…(うまい話が回答として書けないんで省略)
    • good
    • 1
この回答へのお礼

素早いお返事をどうもありがとうございます。
根気よく潰して行くしかないのですね。恥ずかしながら、かれこれ2時間くらいどこがいけないのか考えて、ifがIfになってた以外どうしても分からなかったので質問させてもらいました。(質問した後に気付きました。結局エラーでしたが)
問題用紙を別の所で用意してそこから問題を引き出す感じでしょうか?今一度オブジェクトの使い方を復習したいと思います。
ものすごく丁寧なご回答すごく分かりやすくて助かりました!
ありがとうございました。

お礼日時:2011/02/24 21:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!