Java错误:无法对非静态方法进行静态引用

我正在编写一个Android应用程序,并得到这个错误,但我不知道为什么。 有人可以帮我理解为什么我得到这个错误?

Cannot make a static reference to the non-static method updateScores(List<Score>) from the type DatabaseHandler 

这是相关的代码。

 public class ScoreList extends SherlockFragmentActivity { List<Score> listScore = new ArrayList<Score>(); public void updateListView() { listViewScore.setAdapter(new ScoreListAdapter(ctx, R.layout.score_row_item, listScore)); DatabaseHandler.updateScores(listScore); } } 

这是DatabaseHandler类。 我试着让这个函数成为静态的,但是由于错误而不能这样工作。

 public class DatabaseHandler extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "scoreKeeper"; private static final String TABLE_GAMES = "games"; private static final String KEY_NAME = "name"; private static final String KEY_CHANGE = "scoreChange"; private static final String KEY_TOTAL = "scoreTotal"; public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String CREATE_GAMES_TABLE = "CREATE TABLE " + TABLE_GAMES + "(" + KEY_NAME + " INTEGER PRIMARY KEY," + KEY_CHANGE + " TEXT," + KEY_TOTAL + " TEXT" + ")"; db.execSQL(CREATE_GAMES_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_GAMES); onCreate(db); } public void addScore(Score score) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, score.getName()); values.put(KEY_CHANGE, score.getScoreChange()); values.put(KEY_TOTAL, score.getScoreTotal()); // Inserting Row db.insert(TABLE_GAMES, null, values); db.close(); } public List<Score> getAllScores() { List<Score> scoreList = new ArrayList<Score>(); String selectQuery = "SELECT * FROM " + TABLE_GAMES; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { Score score = new Score("","",""); score.setName(cursor.getString(0)); score.setScoreChange(cursor.getString(1)); score.setScoreTotal(cursor.getString(2)); // Adding contact to list scoreList.add(score); } while (cursor.moveToNext()); } return scoreList; } public void updateScores(List<Score> score) { SQLiteDatabase db = this.getWritableDatabase(); db.execSQL("DROP TABLE IF EXISTS " + TABLE_GAMES); onCreate(db); ContentValues values = new ContentValues(); for(int i = 0; i < score.size(); i++){ values.put(KEY_NAME, score.get(i).getName()); values.put(KEY_CHANGE, score.get(i).getScoreChange()); values.put(KEY_TOTAL, score.get(i).getScoreTotal()); } } } 

因为您正在使用静态引用访问该方法

 DatabaseHandler.updateScores(listScore); 

用类名表示

您必须创build一个DatabaseHandler类的实例并使用该方法。

或者使一个updateScores像静态方法一样,

 static public void updateScores() 

但是我怀疑你在DatabaseHandler类中有更多的代码。 (因为你在这个类中使用Activity上下文的sqlite数据库辅助类)所以最好使DatabaseHandler类的实例实例updateScores()方法updateScores()使用。

 public void updateScores(List<Score> score) 

改成

 public static void updateScores(List<Score> score) 

为什么?

因为你正在使用静态调用

 DatabaseHandler.updateScores(listScore) 

将方法updateScores更改为static ,如下所示:

  public static void updateScores(List<Score> score) 
 DatabaseHandler dbh = new DatabaseHandler(); dbh.updateScores(listScore); 

您可以制作方法

public void updateScores(List score)

作为静态或者你可以在调用者类中创build**DatabaseHandler **的对象:

得分列表

错误消息告诉你exegly问题:您以静态方式引用非静态方法。 有两种可能性:1.你想要有静态方法(见其他答案)2.你想有非静态方法。 然后使用这个调用者片段:

 DatabaseHandler helper = new DatabaseHandler(); helper.updateScores(listScore); 

错误是因为你正在使用类名调用非静态方法。要克服这个错误,你必须做以下任何一件事1。 使您的方法updateScores为静态或2。 创build一个DatabaseHandler的实例,并使用该对象调用该方法。

调用方法使用类名称需要方法是一个静态的