如何解决java.lang.ExceptionInInitializerError - Android Studio (Java-Room Persistence Library)
我目前正在使用 Room 数据库开发一个看起来像这样的情绪跟踪器移动应用
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”解析为 intCaused 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");
解决方法是
-
使要解析的字符串成为有效的int值(如“1”)
- (无需解析,因为您只需设置值即可)例如
public static final int EXTRA_EMOJI = 1
- (无需解析,因为您只需设置值即可)例如
-
为变量使用适当的类型,例如 String 例如
public static final String EXTRA_EMOJI = "com.example.mood.EXTRA_EMOJI"
可能是后者考虑到
data.putExtra(String.valueOf(EXTRA_EMOJI),emoji);
并且 Intent 的 putExtra 方法的第一个参数是键(标识符)。>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。