人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaに関する質問です。Eclipseで出てくるエラーの理由について知りたいです。

今、2つのクラスがあります。

ClassEra.java
https://gist.github.com/AuroraNorthernQuarter/855c9dd731f8a00ac505ef11344596f2
Jidai.java
https://gist.github.com/AuroraNorthernQuarter/da1420345ca34e896b2b41147dbee16a
このうち「Jidai.java」の方は、Eclipse上で下記のようなエラーが出てきました。

6行目:static ClassEra[] data = { …(1)
→The field data cannot be declared static in a non-static inner type,unless initialized with a constant expression

21行目:public static void main(String[] args) { …(2)
→メソッドmainはstaticとして宣言できません。staticメソッドは、staticまたはトップ・レベル型においてのみ宣言できます

33行目:catch(IOException e) { ……(3)
→IOExceptionを型に解決できません

42行目:public static void main(String[] args) { …(4)
→メソッドbinarySearchはstaticとして宣言できません。staticメソッドは、staticまたはトップ・レベル型においてのみ宣言できます

(1)?(4)のエラーの理由と、どう書き換えたらエラーが生じなくなるか、お教えいただけないでしょうか。
よろしくお願い致します。

●質問者: moon-fondu
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●1200ポイント ベストアンサー

>6行目: static ClassEra[] data = { …(1)
inner クラス(Jidai クラスの内側で宣言されてる ClassBinarySearch クラスのようなやつ)は、外側のクラスのインスタンスがあって、なんぼみたいな動きをします。
この ClassEra は、親の Jidai の static なメンバにしておいた方が、悩むことが少なくなります。

>21行目: public static void main(String[] args) { …(2)
こちらも、エラーになってる理由は、(1) と同じようなもので。
Jidai クラスのメソッドにしてください。

>33行目: catch(IOException e) { ……(3)
java.io.IOException を、import してください。

>42行目: public static void main(String[] args) { …(4)
(2) と同じ理由です。
static じゃないメソッドにして、Jidai クラスのメソッドで ClassBinarySearch のインスタンスを作って呼び出すか、static にしたいなら、Jidai クラスのメソッドにしてください。


質問で提示されたソースの範囲なら、Jidai クラスにはメソッドもメンバもないので、ClassBinarySearch を innerクラスにしない、という方が素直かもしれません。


moon-fonduさんのコメント
a-kuma3さんありがとうございます! ただすみません、具体的にどう書き換えたり追記すればよいのか、お教えいただけないでしょうか。 外側のクラスのインスタンスがあってなんぼ、ですが。 外側のクラス、 ClassEra https://gist.github.com/AuroraNorthernQuarter/855c9dd731f8a00ac505ef11344596f2 には、現状インスタンスがないのでしょうか? "親の Jidai の static なメンバにする"、"Jidai クラスのメソッドにする"が、判らず… java.io.IOException をimport する記述については判るのですが… 度々お手数お掛け致しますが、よろしくお願いします<m(__)m>

a-kuma3さんのコメント
回答に書いた内容を、単純にコードに落とすと、以下のような感じです。 >|java| package testprogramm; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Jidai { static ClassEra[] data = { new ClassEra( 0,"原始時代"), new ClassEra( 593,"飛鳥時代"), new ClassEra( 710,"奈良時代"), new ClassEra( 794,"平安時代"), new ClassEra(1192,"鎌倉時代"), new ClassEra(1334,"室町時代"), new ClassEra(1573,"安土桃山時代"), new ClassEra(1603,"江戸時代"), new ClassEra(1868,"明治時代"), new ClassEra(1912,"大正時代"), new ClassEra(1926,"昭和時代"), new ClassEra(1989,"平成時代") }; public class ClassBinarySearch { public void main(String[] args) { try{ //キーボードからの入力 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("探索したい年を入力:"); String s = in.readLine(); int y = Integer.parseInt(s); //探索 s = binarySearch(y); System.out.println(y + "年は" + s + "です"); } catch(IOException e) { System.out.println("IO error"); } } /************************************************* 探索 戻り値:時代名を表す文字列 *************************************************/ String binarySearch(int key) { //key:探索したい年 String s; //戻り値 if (key < Jidai.data[1].getYear()) { s = Jidai.data[0].getEra(); } else if (key >= Jidai.data[Jidai.data.length-1].getYear()) { s = Jidai.data[Jidai.data.length-1].getEra(); } else { s = search(key,1,Jidai.data.length-1); } return s; } /************************************************* 再帰関数 *************************************************/ String search(int key,int start,int n) { //key :探索したい値 //start:探索する範囲のはじめの添え字 //n :探索する範囲の個数 int mid; //探索する範囲の中央の添え字 String s; //戻り値 if (n == 2) { s = Jidai.data[start].getEra(); } else { mid = start+n/2; if (Jidai.data[mid].getYear() == key) { s = Jidai.data[mid].getEra(); } else if (Jidai.data[mid].getYear() < key) { //後半を探索 n = start + n - mid; //新しい範囲の個数 s = search(key,mid,n); } else { //前半を探索 n = mid - start + 1; //新しい範囲の個数 s = search(key,start,n); } } return s; } } public static void main(String[] args) { ClassBinarySearch binSearch = new ClassBinarySearch(); binSearch.main(args); } } ||< 内側の ClassBinarySearch には、あまり意味が見いだせないので、以下のように innerクラスを使わない方が素直なように思うのですが。 >|java| package testprogramm; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Jidai { static ClassEra[] data = { new ClassEra( 0,"原始時代"), new ClassEra( 593,"飛鳥時代"), new ClassEra( 710,"奈良時代"), new ClassEra( 794,"平安時代"), new ClassEra(1192,"鎌倉時代"), new ClassEra(1334,"室町時代"), new ClassEra(1573,"安土桃山時代"), new ClassEra(1603,"江戸時代"), new ClassEra(1868,"明治時代"), new ClassEra(1912,"大正時代"), new ClassEra(1926,"昭和時代"), new ClassEra(1989,"平成時代") }; public static void main(String[] args) { try{ //キーボードからの入力 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("探索したい年を入力:"); String s = in.readLine(); int y = Integer.parseInt(s); //探索 s = binarySearch(y); System.out.println(y + "年は" + s + "です"); } catch(IOException e) { System.out.println("IO error"); } } /************************************************* 探索 戻り値:時代名を表す文字列 *************************************************/ static String binarySearch(int key) { //key:探索したい年 String s; //戻り値 if (key < data[1].getYear()) { s = data[0].getEra(); } else if (key >= data[data.length-1].getYear()) { s = data[data.length-1].getEra(); } else { s = search(key,1,data.length-1); } return s; } /************************************************* 再帰関数 *************************************************/ static String search(int key,int start,int n) { //key :探索したい値 //start:探索する範囲のはじめの添え字 //n :探索する範囲の個数 int mid; //探索する範囲の中央の添え字 String s; //戻り値 if (n == 2) { s = data[start].getEra(); } else { mid = start+n/2; if (data[mid].getYear() == key) { s = data[mid].getEra(); } else if (data[mid].getYear() < key) { //後半を探索 n = start + n - mid; //新しい範囲の個数 s = search(key,mid,n); } else { //前半を探索 n = mid - start + 1; //新しい範囲の個数 s = search(key,start,n); } } return s; } } ||<

moon-fonduさんのコメント
ありがとうございます、色々な組み方があるんですね。 innerクラスを使わない方が読みやすい気がします。 そちらの方をEclipse上で貼り付けてみますと、なぜかClassEraの文字列がある行でエラー表示「ClassEraを型に解決できません」というのが出てきます。http://f.hatena.ne.jp/moon-fondu/20190524031949 度々申し訳ございません、このエラーが出る原因と、解決法もお教えいただけないでしょうか。 よろしくお願い致します<m(__)m>
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ