微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java.lang.ExceptionInInitializerError - Android Studio (Java-Room Persistence Library)

如何解决java.lang.ExceptionInInitializerError - Android Studio (Java-Room Persistence Library)

我目前正在使用 Room 数据库开发一个看起来像这样的情绪跟踪器移动应用

Mood Tracker Homepage Recycler View

Add New Entry

MVVM 架构(Dao 数据库和存储库)是在此 playlist 之后构建的。我为 Kotlin 语言的表情符号选择器找到了 reference。但是,我对移动应用程序开发很陌生,我尝试自己修改它,但不幸的是我遇到了很多错误,而且我不知道如何存储选定的表情符号,我将所有 5 个表情符号作为可绘制选择器放在选定的位置将存储在数据库中。但是,我的应用程序在模拟器上运行时崩溃,这是 logcat 中的错误消息。

2021-04-06 18:52:36.299 8608-8608/com.example.mood E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mood,PID: 8608
    java.lang.ExceptionInInitializerError
        at java.lang.class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1253)
        at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3353)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        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:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.NumberFormatException: For input string: "com.example.mood.EXTRA_EMOJI"
        at java.lang.Integer.parseInt(Integer.java:615)
        at java.lang.Integer.parseInt(Integer.java:650)
        at com.example.mood.AddMoodActivity.<clinit>(AddMoodActivity.java:29)
        at java.lang.class.newInstance(Native Method) 
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) 
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) 
        at android.app.Instrumentation.newActivity(Instrumentation.java:1253) 
        at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3353) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
        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:2066) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

心情.java

    @Entity(tableName = "mood_history")
    public class Mood {

    @PrimaryKey(autoGenerate = true)
    private int mood_id;

    private String date;
    private int emoji;
    private String journal_text;

    public Mood(String date,int emoji,String journal_text) {
        this.date = date;
        this.emoji = emoji;
        this.journal_text = journal_text;
    }

    public void setMood_id(int mood_id) {
        this.mood_id = mood_id;
    }

    public int getMood_id() {
        return mood_id;
    }

    public String getDate() {
        return date;
    }

    public int getEmoji() {
        return emoji;
    }

    public String getJournal_text() {
        return journal_text;
    }
}

MoodAdapter.java

public class MoodAdapter extends RecyclerView.Adapter<MoodAdapter.MoodHolder> {

    private List<Mood> moods = new ArrayList<>();

    @NonNull
    @Override
    public MoodHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.mood_item,parent,false);
        return new MoodHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MoodHolder holder,int position) {
        Mood currentMood = moods.get(position);
        holder.date.setText(currentMood.getDate());
        holder.emoji.setimageResource(currentMood.getEmoji());
        holder.journal_text.setText(currentMood.getJournal_text());
    }

    @Override
    public int getItemCount() {
        return moods.size();
    }

    public void setMoods(List<Mood> moods){
        this.moods = moods;
        notifyDataSetChanged();
    }

    //swipe to delete
    public Mood getMoodAt (int position){
        return moods.get(position);
    }

    class MoodHolder extends RecyclerView.ViewHolder{
        private TextView date;
        private ImageView emoji;
        private TextView journal_text;

        public MoodHolder(@NonNull View itemView) {
            super(itemView);
            date = itemView.findViewById(R.id.date);
            emoji = itemView.findViewById(R.id.emoji);
            journal_text = itemView.findViewById(R.id.journal_text);
        }
    }
}

心情活动.java

public class MoodActivity extends AppCompatActivity {

    public static final int ADD_NOTE_REQUEST = 1;
    private Moodviewmodel moodviewmodel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_mood);

        FloatingActionButton buttonAddMood = findViewById(R.id.button_add);
        buttonAddMood.setonClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MoodActivity.this,AddMoodActivity.class);
                startActivityForResult(intent,1);
            }
        });

        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new linearlayoutmanager(this));
        recyclerView.setHasFixedSize(true);

        MoodAdapter adapter = new MoodAdapter();
        recyclerView.setAdapter(adapter);

        moodviewmodel = new viewmodelProvider(this,viewmodelProvider.
                AndroidviewmodelFactory.getInstance(this.getApplication())).get(Moodviewmodel.class);

        moodviewmodel.getAllMood().observe(this,new Observer<List<Mood>>() {
            @Override
            public void onChanged(List<Mood> moods) {
                adapter.setMoods(moods);
            }
        });

        //swipe to delete
        new itemtouchhelper(new itemtouchhelper.SimpleCallback(0,itemtouchhelper.LEFT | itemtouchhelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder,@NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder,int direction) {
                moodviewmodel.delete(adapter.getMoodAt(viewHolder.getAdapterPosition()));
                Toast.makeText(MoodFragment.this,"Mood Entry deleted",Toast.LENGTH_LONG).show();
            }
        }).attachToRecyclerView(recyclerView);
    }

    //part 6 (add new entry)
    @Override
    protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
        super.onActivityResult(requestCode,resultCode,data);

        if (requestCode == ADD_NOTE_REQUEST && resultCode == RESULT_OK){
            String date = data.getStringExtra(AddMoodActivity.EXTRA_DATE);
            int emoji = Integer.parseInt(data.getStringExtra(String.valueOf(AddMoodActivity.EXTRA_EMOJI)));
            String journal_text = data.getStringExtra(AddMoodActivity.EXTRA_JOURNAL);

            Mood mood = new Mood(date,emoji,journal_text);
            moodviewmodel.insert(mood);

            Toast.makeText(this,"Entry saved",Toast.LENGTH_LONG).show();
        }
        else{
            Toast.makeText(this,"Entry not saved",Toast.LENGTH_LONG).show();
        }
    }

    //part 7 (delete all menu)
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.mood_menu,menu);
        return true;
    }

    @Override
    public boolean onoptionsItemSelected(@NonNull MenuItem item) {

        switch(item.getItemId()){
            case R.id.delete_all_mood:
            moodviewmodel.deleteall();
            Toast.makeText(this,"All entries deleted",Toast.LENGTH_LONG).show();
            return true;
            default:
                return super.onoptionsItemSelected(item);
        }
    }
}

AddMoodActivity.java

public class AddMoodActivity extends AppCompatActivity {

    public static final String EXTRA_DATE = "com.example.mood.EXTRA_DATE";
    public static final int EXTRA_EMOJI = Integer.parseInt("com.example.mood.EXTRA_EMOJI");
    public static final String EXTRA_JOURNAL = "com.example.mood.EXTRA_JOURNAL";

    private static final String TAG = "AddMoodActivity";

    private EditText pick_date,edit_journal;
    private ImageView edit_emoji;
    private ImageView happy_selected,blessed_selected,moody_selected,neutral_selected,sad_selected;
    private DatePickerDialog.OnDateSetListener onDateSetListener;

    Button btnDatePicker;
    private int emoji_selected = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_mood);

        pick_date = findViewById(R.id.pick_date);
        edit_emoji = findViewById(R.id.emoji);
        edit_journal = findViewById(R.id.edit_journal_text);
        btnDatePicker = findViewById(R.id.btn_date);
        happy_selected = findViewById(R.id.happy_selected);
        blessed_selected = findViewById(R.id.blessed_selected);
        moody_selected = findViewById(R.id.moody_selected);
        neutral_selected = findViewById(R.id.neutral_selected);
        sad_selected = findViewById(R.id.sad_selected);

        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);
        setTitle("Add New Mood Entry");

        //select Date
        btnDatePicker.setonClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int month = cal.get(Calendar.MONTH);
                int day = cal.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dialog = new DatePickerDialog(
                        AddMoodActivity.this,android.R.style.Theme_Holo_Light_Dialog_MinWidth,onDateSetListener,year,month,day);
                dialog.getwindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();
            }
        });

        //set chosen date
        onDateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view,int year,int monthOfYear,int dayOfMonth) {
                Log.d(TAG,"onDateSet: dd/mm/yyyy "+ dayOfMonth + "/" + monthOfYear + "/" + year);

                //String month1 = DateFormat.getDateInstance(DateFormat.SHORT).format(month);
                //SimpleDateFormat date1 = new SimpleDateFormat("dd MMM YYYY");
                String date = dayOfMonth + "/" + (monthOfYear + 1) + "/" + year;
                pick_date.setText(date);
            }
        };
    }


    //a selector to pick the emoji which will be displayed in recycler view
    private void emojiSelected(){
        happy_selected.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                happy_selected.isSelected();
                emoji_selected = R.drawable.happy;
            }
        });

        blessed_selected.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                blessed_selected.isSelected();
                emoji_selected = R.drawable.blessed;
            }
        });

        neutral_selected.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                neutral_selected.isSelected();
                emoji_selected = R.drawable.neutral;
            }
        });

        moody_selected.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                moody_selected.isSelected();
                emoji_selected = R.drawable.moody;
            }
        });

        sad_selected.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sad_selected.isSelected();
                emoji_selected = R.drawable.sad;
            }
        });
    }


    private void saveMood(){

        String date = pick_date.getText().toString();
        int emoji = edit_emoji.getId();
        String journal_text = edit_journal.getText().toString();

        if (date.trim().isEmpty() /*|| emoji.trim().isEmpty()*/){
            Toast.makeText(this,"Please insert data",Toast.LENGTH_LONG).show();
            return;
        }
        Intent data = new Intent();
        data.putExtra(EXTRA_DATE,date);
        data.putExtra(String.valueOf(EXTRA_EMOJI),emoji);
        data.putExtra(EXTRA_JOURNAL,journal_text);

        setResult(RESULT_OK,data);
        finish();
    }


    //menu to direct to new mood entry form's layout
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.add_mood_menu,menu);
        return true;
    }

    @Override
    public boolean onoptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.save_mood:
                saveMood();
                return true;
            default:
                return super.onoptionsItemSelected(item);
        }
    }
}

解决方法

您尝试按照 :-

将“com.example.mood.EXTRA_EMOJI”解析为 int
Caused by: java.lang.NumberFormatException: For input string: "com.example.mood.EXTRA_EMOJI"
  • 注意短语caused By的使用。

AddMoodActivity.java 中看到该行

public static final int EXTRA_EMOJI = Integer.parseInt("com.example.mood.EXTRA_EMOJI");

解决方法是

  1. 使要解析的字符串成为有效的int值(如“1”)

    1. (无需解析,因为您只需设置值即可)例如public static final int EXTRA_EMOJI = 1
  2. 为变量使用适当的类型,例如 String 例如public static final String EXTRA_EMOJI = "com.example.mood.EXTRA_EMOJI"

  3. 可能是后者考虑到 data.putExtra(String.valueOf(EXTRA_EMOJI),emoji); 并且 IntentputExtra 方法的第一个参数是键(标识符)。>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。