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)のエラーの理由と、どう書き換えたらエラーが生じなくなるか、お教えいただけないでしょうか。
よろしくお願い致します。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2019/06/07 20:45:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154

ポイント1200pt

>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クラスにしない、という方が素直かもしれません。

他1件のコメントを見る
id:a-kuma3

回答に書いた内容を、単純にコードに落とすと、以下のような感じです。

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クラスを使わない方が素直なように思うのですが。

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;
    }
}
2019/05/20 14:32:24
id:moon-fondu

ありがとうございます、色々な組み方があるんですね。
innerクラスを使わない方が読みやすい気がします。

そちらの方をEclipse上で貼り付けてみますと、なぜかClassEraの文字列がある行でエラー表示「ClassEraを型に解決できません」というのが出てきます。http://f.hatena.ne.jp/moon-fondu/20190524031949

度々申し訳ございません、このエラーが出る原因と、解決法もお教えいただけないでしょうか。
よろしくお願い致します<m(__)m>

2019/05/24 03:21:39

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません