美人すぎない化粧品販売員がアプリ開発を目指す

Javaの構文、オブジェクト指向、APIなど、プログラミング初心者の私がアプリ開発までに理解したことをまとめたブログ

エラーの種類 〜コンパイル出来ない場合〜

☆ コンパイル出来ないとき

 

・「return文が指定されていません」

 「このメソッドは型~の結果を必ず返す必要があります」

 

原因 戻り値を返すように宣言されたメソッドの内部で

        「戻り値を返さない可能性がある場合」

 

ex int型を返すメソッドの中身

        if(条件式){return(;)

                                    }←条件式が満たされない場合には値が戻されない

 また、実行途中に例外が発生した場合にreturnが実行されない可能性もある。

 

解決策 処理中の条件分岐や例外発生の有無によらず、

    常に何らかの値をreturnするようにプログラムを修正する

 

 

 

・「~は~でprivateアクセスされます」

 「~は不可視です」

 

原因 カプセル化(特定のものからしかアクセスできないようにすること private/package private)により、

アクセス権限がないクラス、フィールド、メソッドを利用しようとしている

ex 同一クラスからしかアクセスできないprivate宣言されているフィールドを他クラスから利用しようとした場合

 

 

解決策 利用しようとしているクラスやメンバのアクセス修飾が正しいことを確認する

※ privateフィールドへのアクセスが必要な場合、

フィールドのアクセス修飾をpublicなどへ緩和するのではなく、

    getterやsetterが既に存在しないか確認し、なければ作成を検討する

 

 

コンストラクタを定義してもnewで利用出来ない

 

原因 コンストラクタの宣言に間違いがあり、コンストラクタとして見なされていない可能性がある

 

 ex. Heroクラスに引数2つのコンストラクタ

    public void Hero(String name,int hp)

 //コンストラクタの宣言にも関わらず戻り値voidの記述がある

コンストラクタ宣言が間違っているので、インスタンス化するとエラー

 

よくあるもの

 戻り値を宣言している(コンストラクタは戻り値なし)

 クラス名とコンストラクタ名に違いがある

(コンストラクタ名はクラス名と一緒でなければならない)

 

解決策

コンストラクタ宣言に戻り値がついてないことを確認する(void記述もだめ)

コンストラクタ名がクラス名と完全に一致していることを確認する

 

 

オーバーロード(複数宣言)ができない

「~は~で定義されています」

 

原因 "戻り値だけしか違いがない"場合には、オーバーロードが利用できない

 

ex public void m(int a)

    public int m(int a)

 

解決策 

メソッド名を変更して同じメソッド名を使うこと自体を諦める

            (オーバーロード自体を諦める)

・引数の数か型が違うものになるようにする

         (戻り値だけの違いではないように修正する)

メソッド自体に継承関係や親クラスが存在するのであれば、親クラスの型を戻り値にすることで(多態性を利用)

     メソッドを2つ作るのではなく、1つに統一する

 

 

・ メソッドの呼び出しの戻り値をDate型変数に代入できない

  「互喚性のない型です」「型が不一致です」

 

ex 前提 "クラスAのa( )メソッドはDate型の戻り値を返す"とする

             クラスBのb( )メソッド内部でa( )メソッドを呼び出す

     →その結果をDate型変数に代入しようとするとエラー

      (Date型の戻り値を設定しているにも関わらず)

 

原因 java.util.Date型で返されたインスタンスjava.sql.Date型の変数に代入しようとしている可能性あり

       クラスA  java.util.Date がimportされている

       クラスB java.sql.Date     がimportされている

       (importされているパッケージは同じでないといけない)

 

解決策 正しいimport文が記述されているかソースコードを確認

  ※ java.util.Dateクラス以外にも入力支援によりimport間違いしやすいクラス

     java.util.Listとjava.awt.List

 

 

「例外~は報告されません」

  「処理されない例外の型~です」

 

原因 

前提 "メソッドA内で「チェック例外が発生する可能性のあるメソッドB」を呼び出す"

    しかし、メソッドA内ではtry-catchとthowsどちらも指定されていない

    (例外発生時にどのように動作をすべきかメソッドAに指定していない)

 

解決策 メソッドBの呼び出しをtry-catch文で囲む

    例外発生時にメソッドB内では対処を行わず、呼び出し先のメソッドAに例外処理を任せる場合、

     メソッドBの修飾にthrowsを追加する

 

 

・ 「シンボルを見つけられません」(その2)

  「暗黙的スーパー・コンストラクタ~はデフォルト・コンストラクタについては未定義です」

 

原因 親クラスA….引数があるコンストラクタ

   その子クラスB…コンストラクタが指定されてない

                                               (引数なしのコンストラクタと見なされる)

 

 子クラスBに自動で追加されるデフォルトコンストラクタsuper( )は引数がないため、

 親クラスのAの引数なしコンストラクタを呼び出そうとするが、親クラスに引数なしのコンストラクタがないために、

  エラーとなる

 

解決策 子クラスにコンストラクタを引数のある形(suoer(引数))と記述して、引数のある親コンストラクタをきちんと呼び出す