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的实例,并使用该对象调用该方法。
调用方法使用类名称需要方法是一个静态的