我是Android Studio的新手,我刚完成我的第一个应用程序。然后,我想在我的手机上对其进行测试,但是它似乎不起作用。即使它在Android Studio中的虚拟设备上像超级按钮一样工作,它也甚至在启动前就崩溃了。我将在此处发布一些信息,并希望有人能帮助我,因为我没有真正了解它。
Logcat输出:
2020-06-06 05:01:12.188 12297-12297/? I/dlingsassisten: Late-enabling -Xcheck:jni
2020-06-06 05:01:12.218 12297-12297/? E/dlingsassisten: Unknown bits set in runtime_flags: 0x8000
2020-06-06 05:01:12.482 12297-12297/com.example.handlingsassistent I/Perf: Connecting to perf service.
2020-06-06 05:01:12.495 12297-12297/com.example.handlingsassistent I/dlingsassisten: [GL_OOM] ClampGrowthLimit 268435456
2020-06-06 05:01:12.499 12297-12297/com.example.handlingsassistent V/Font: Change font:1
2020-06-06 05:01:12.500 12297-12297/com.example.handlingsassistent V/Font: Default family:android.graphics.Typeface@3668eb82
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: Fail to get file list com.example.handlingsassistent
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: Fail to get file list com.example.handlingsassistent
2020-06-06 05:01:12.507 12297-12332/com.example.handlingsassistent E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-06-06 05:01:12.690 12297-12297/com.example.handlingsassistent W/dlingsassisten: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
2020-06-06 05:01:12.692 12297-12297/com.example.handlingsassistent W/dlingsassisten: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
2020-06-06 05:01:12.864 12297-12297/com.example.handlingsassistent D/AndroidRuntime: Shutting down VM
2020-06-06 05:01:12.868 12297-12297/com.example.handlingsassistent E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.handlingsassistent, PID: 12297
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.handlingsassistent/com.example.handlingsassistent.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3387)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3526)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2122)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7695)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:392)
at android.widget.ListView.setAdapter(ListView.java:585)
at com.example.handlingsassistent.MainActivity.onCreate(MainActivity.java:42)
at android.app.Activity.performCreate(Activity.java:7820)
at android.app.Activity.performCreate(Activity.java:7809)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3362)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3526)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2122)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7695)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
2020-06-06 05:01:12.910 12297-12297/com.example.handlingsassistent I/Process: Sending signal. PID: 12297 SIG: 9
主要活动
package com.example.handlingsassistent;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
List<String> arrList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadData();
ListView shoppingListView = findViewById(R.id.shoppingListView);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this,
R.layout.list_layout,
arrList);
shoppingListView.setAdapter(adapter);
//Möjliggör att kunna välja flera alternativ i listan.
shoppingListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
shoppingListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
arrList.remove(position);
adapter.notifyDataSetChanged();
saveData();
return true;
}
});
}
public void addToList (View v){
if( ((TextView) findViewById(R.id.inputText)).getText().toString().isEmpty()) {
Log.d("Empty", "Input is empty");
}
else {
arrList.add(((TextView) findViewById(R.id.inputText)).getText().toString());
((ListView) findViewById(R.id.shoppingListView)).invalidateViews();
((TextView) findViewById(R.id.inputText)).setText("");
saveData();
}
}
// Referens: https://developer.android.com/guide/topics/ui/dialogs.html
public void clearList (View v){
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle(R.string.alert_title);
alert.setMessage(R.string.alert_message);
alert.setPositiveButton(R.string.alert_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
arrList.clear();
((ListView) findViewById(R.id.shoppingListView)).invalidateViews();
saveData();
}
});
alert.setNegativeButton(R.string.alert_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
alert.create().show();
}
// Referens: https://www.youtube.com/watch?v=jcliHGR3CHo
private void saveData(){
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(arrList);
editor.putString("task list", json);
editor.apply();
}
// Referens: https://www.youtube.com/watch?v=jcliHGR3CHo
private void loadData(){
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("task list", null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
arrList = gson.fromJson(json, type);
}
public void loadTemplateActivity(View v){
Intent intent = new Intent(this, TemplateActivity.class);
startActivity(intent);
}
public void loadSpendingActivity(View v){
Intent intent = new Intent(this, SpendingActivity.class);
startActivity(intent);
}
}```
Hope this information is enough. I'll keep an eye out if you request something else to help me out.
答案 0 :(得分:2)
在构造类初始化之后,您的arrList
可能会被设置回null。
尝试检查null并按如下所示进行设置。
private void loadData(){
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("task list", null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
arrList = gson.fromJson(json, type);
if (arrList == null) {
arrList = new ArrayList<String>();
}
}
如果您以前保存过列表,我认为它不会崩溃。这可能就是为什么它没有在模拟器上崩溃的原因。它可能会在任何新设备上崩溃。
答案 1 :(得分:1)
您将收到此异常,因为您正在尝试使用空适配器构建ListView。因为您是第一次启动应用,所以您以loadData()
方法调用onCreate()
;并且为arrList
分配了一个空值,因为SharedPreference
仍然没有保存在ot中。
您可以解决此问题,以首先检查返回的SharedPference
是否不为空;否则分配一个空数组
因此,如下更改loadData()
private void loadData(){
SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString("task list", null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
arrList = gson.fromJson(json, type);
if (arrList == null)
arrList = new ArrayList<String>();
}