Code Fix

中級

non-static variable cannot be referenced の原因と直し方

staticとインスタンスの境界。mainから他のメンバーを呼ぶときの3つの選択肢を比較します。

エラーメッセージの読み方

Main.java:5: error: non-static variable count
Main.java
ファイル名
5
行番号 — javacが異常に気づいた位置。原因の行とは限りません
error
種別 — コンパイルエラー。実行まで到達しません
non-static variable count
内容 — javacが期待していたもの、または見つけられなかったもの

このエラーが出る典型パターン

パターン1

 1  public class Main {
 2      int count = 10;
 3  
 4      public static void main(String[] args) {
 5          System.out.println(count           );
                                       ^
 6      }
 7  }
Main.java:5: error: non-static variable count cannot be referenced from a static context

countはインスタンスごとの変数ですが、mainはstaticなので「どのMainか」が決まりません。

直し方: countnew Main().count にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  public class Main {
 2      void greet() {
 3          System.out.println("hi");
 4      }
 5      public static void main(String[] args) {
 6          this      .greet();
                 ^
 7      }
 8  }
Main.java:6: error: non-static variable this cannot be referenced from a static context

staticメソッドの中にthisは存在しません。インスタンスメソッドを呼ぶには実体が要ります。

直し方: thisnew Main() にします。

この問題を解いてみる →

パターン3

 1  public class Main {
 2              int LIMIT = 100;
           ^
 3  
 4      public static void main(String[] args) {
 5          System.out.println(LIMIT);
 6      }
 7  }
Main.java:5: error: non-static variable LIMIT cannot be referenced from a static context

staticなmainから直接使いたい変数はstaticにします。定数は static final にするのが慣習です。

直し方: (空)static にします。

この問題を解いてみる →

よくある誤解

staticを足せばエラーは消えますが、それが正しいとは限りません。多くの場合、設計を見直す合図です。

まとめ

non-static variable cannot be referencedは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)