我对这种情况感到困惑。下面的代码工作正常,但Android Studio警告我setAdapter()可能会产生'java.lang.NullPointerException':
public class PlayerManagement extends AppCompatActivity {
private Cursor c;
private SQLiteDatabase db;
private String selectedPlayerId, selectedPlayerName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player_management);
ListView listView = (ListView) findViewById(android.R.id.list);
try {
MTGPS_DBHelper dbHelper = new MTGPS_DBHelper(this);
db = dbHelper.getWritableDatabase();
new getPlayersCursorAsync().execute();
final SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(PlayerManagement.this, android.R.layout.simple_list_item_1, c,
new String[]{MTGPS_DB_Contract.Player.COLUMN_NAME_PLAYER_NAME},
new int[]{android.R.id.text1}, 0);
listView.setAdapter(mAdapter);
...
这是XML文件activity_player_management:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_players_found"
android:textSize="25sp" />
</LinearLayout>
正如我所说,一切正常,但我不明白为什么Android Studio会提醒我。如果我将ListView声明为类字段,那么“问题”就会消失。只有当我在onCreate方法中声明Listview时才会收到警报。
答案 0 :(得分:1)
setAdapter()可能会产生&#39; java.lang.NullPointerException
这只是一个警告。 findViewById()
会返回@Nullable
,即可能null
并且您在没有无效检查的情况下在返回值上调用方法。
您可以取消警告,例如通过添加
//noinspection ConstantConditions
在上一行。
如果我将ListView声明为类字段,那么&#34;问题&#34;消失。只有当我在onCreate方法中声明Listview时才会收到警报。
无效分析器无法查看字段的写入位置,也不会产生警告。对局部变量的分析更容易。
答案 1 :(得分:0)
将android:id="@android:id/list"
更改为android:id="@+id/list"
@+id
- 当您将自己的id设置为应用程序命名空间中的listView时,会使用此方法。
@android:id
- 当您将视图的id设置为预定义的android命名空间时使用。
同时将android.R.id.list
替换为R.id.list
答案 2 :(得分:0)
将代码更改为
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_players_found"
android:textSize="25sp" />
</LinearLayout>
在活动中声明如下:
ListView listView = (ListView) findViewById(R.id.list);
TextView textView = (TextView) findViewById(R.id.empty);
答案 3 :(得分:0)
试试这个,
public class PlayerManagement extends AppCompatActivity {
private Cursor c;
private SQLiteDatabase db;
private String selectedPlayerId, selectedPlayerName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player_management);
ListView listView = (ListView) findViewById(android.R.id.list);
try {
MTGPS_DBHelper dbHelper = new MTGPS_DBHelper(this);
db = dbHelper.getWritableDatabase();
new getPlayersCursorAsync().execute();
final SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(PlayerManagement.this, android.R.layout.simple_list_item_1, c,
new String[]{MTGPS_DB_Contract.Player.COLUMN_NAME_PLAYER_NAME},
new int[]{android.R.id.text1}, 0);
if(mAdapter!=null)
{
listView.setAdapter(mAdapter);
}
...
答案 4 :(得分:0)
将listView ID android:id="@android:id/list"
更改为 android:id="@+id/list"
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" />