老师,我程序运行就崩溃,看日志是报空指针异常,但看不出来有什么问题
来源:3-2 项目作业
皮卡鲲
2021-12-10 00:35:19
log报红情况:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.borrowbooks, PID: 9321
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.borrowbooks/com.example.borrowbooks.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
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:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.borrowbooks.MainActivity.setListeners(MainActivity.java:129)
at com.example.borrowbooks.MainActivity.onCreate(MainActivity.java:62)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
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:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
I/Process: Sending signal. PID: 9321 SIG: 9
--------------------------------------------------------------------
然后我查看说的对应位置,是在看不出来,请求老师看一下
相关截图:



相关代码:
package com.example.borrowbooks;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Cannot invoke method length() on null object";
private Readers readers;
private RadioGroup sexRadioGroup;
private EditText readersNameEditText;
private EditText leadingTimeEditText;
private ImageView displayImageView;
private CheckBox historyCheckBox, suspenseCheckBox, literatureCheckBox;
private boolean isHistory;
private boolean isSuspense;
private boolean isLiterature;
private SeekBar yearsSeekBar;
private Button searchButton;
private Button nextButton;
private List<Books> books;
private List<Books> booksResult;
private int year;
private TextView displayYears;
private int currentBookNum;
private void findView() {
sexRadioGroup = findViewById(R.id.radioGroup_Sex);
readersNameEditText = findViewById(R.id.editText_ReaderName);
leadingTimeEditText = findViewById(R.id.editView_LeadingTime);
displayImageView = findViewById(R.id.imageView_Display);
displayYears = findViewById(R.id.textView_DisplayYears);
historyCheckBox = findViewById(R.id.checkBox_history);
suspenseCheckBox = findViewById(R.id.checkBox_Suspense);
literatureCheckBox = findViewById(R.id.checkBox_Literature);
yearsSeekBar = findViewById(R.id.seekBar_Years);
searchButton = findViewById(R.id.search_button);
nextButton = findViewById(R.id.button_Next);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
initData();
setListeners();
}
private void initData() {
books = new ArrayList<>();
books.add(new Books("人生感悟", 16, R.mipmap.aa, false, false, true));
books.add(new Books("边城", 18, R.mipmap.bb, false, false, true));
books.add(new Books("sapir", 25, R.mipmap.cc, false, true, false));
books.add(new Books("光辉岁月", 30, R.mipmap.dd, true, false, false));
books.add(new Books("宋词三百首", 13, R.mipmap.ee, false, false, true));
books.add(new Books("中国古代文学教学纲要", 18, R.mipmap.ff, true, false, true));
books.add(new Books("无花果", 16, R.mipmap.gg, false, false, true));
books.add(new Books("古镇记忆", 36, R.mipmap.hh, false, false, true));
readers = new Readers();
booksResult = new ArrayList<>();
}
private void setListeners() {
sexRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radioButton_man:
readers.setSex("男");
break;
case R.id.radioButton_woman:
readers.setSex("女");
break;
}
}
});
historyCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
isHistory = isChecked;
}
});
suspenseCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
isSuspense = isChecked;
}
});
literatureCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
isLiterature = isChecked;
}
});
yearsSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
year = seekBar.getProgress();
Toast.makeText(MainActivity.this, "年龄" + year, Toast.LENGTH_SHORT).show();
displayYears.setText(year);
}
});
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
search();
}
});
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentBookNum++;
}
});
}
private void search() {
if (booksResult == null) {
booksResult = new ArrayList<Books>();
}
booksResult.clear();
currentBookNum = 0;
for (int i = 0; i < books.size(); i++) {
Books book = books.get(i);
if (book != null) {
if (book.getSuitYear() < year && (book.isHistory() == isHistory || book.isSuspense() == isSuspense || book.isLiterature() == isLiterature)) {
booksResult.add(book);
}
}
}
if (currentBookNum < booksResult.size()) {
displayImageView.setImageResource(booksResult.get(currentBookNum).getImageView());
} else {
displayImageView.setImageResource(R.mipmap.f);
}
}
}1回答
好帮手慕雪
2021-12-14
同学,你好!空指针异常了,MainActivity.java第129行,调用OnClickListener引起的

简单看是这个对象没有初始化,但代码中有调用findView(),那你再跟踪一下,是不是这个id写了。祝:学习愉快
相似问题