gpt4 book ai didi

java - 如何防止将用户输入添加到 MPandroidchart 时出现 java.lang.nullpointerException

转载 作者:行者123 更新时间:2023-12-02 00:41:14 28 4
gpt4 key购买 nike

我使用 MPandroidchart 在 android studio 上的 fragment 中创建了一个折线图,并使其图表的点来自用户输入。但是,我收到错误“java.lang.NullPointerException”。我知道此错误是由于尝试使用空值引起的,但我不确定如何在我的情况下修复它。

编辑:用户输入保存在房间数据库中

我从一个方法中检索用户输入,该方法中有代码确保输入为空时不会保存。我认为问题是因为图表正在尝试在用户添加数据之前构建,因为输入选项是显示图表的 fragment 的一部分,因此图表正在尝试在数据准备好之前构建。

图.java

public class Graph extends Fragment {

public Graph() {
// Required empty public constructor
}
private LineChart mChart;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_graph, container, false);
//initialize input1 database
InputRoomDatabase db = Room.databaseBuilder(getActivity(),InputRoomDatabase.class, "input_database")
.build();
//initialize chart
mChart = view.findViewById(R.id.chart);
//set description
Description description = new Description();
description.setText("Blood glucose levels");
mChart.setDescription(description);
//set description if no data is available
mChart.setNoDataText("No Data Available. Add a blood glucose level input to see your graph");
//enable touch gestures
mChart.setTouchEnabled(true);
//enable scaling and dragging
mChart.setDragEnabled(true);
mChart.setScaleEnabled(true);
//draw background grid
mChart.setDrawGridBackground(true);
//draw x-axis
XAxis xAxis = mChart.getXAxis();
xAxis.setEnabled(false);
// setting position to TOP and INSIDE the chart
xAxis.setPosition(XAxis.XAxisPosition.TOP_INSIDE);
// setting text size for our axis label
xAxis.setTextSize(10f);
xAxis.setTextColor(Color.BLACK);
// to draw axis line
xAxis.setDrawAxisLine(true);
xAxis.setDrawGridLines(false);

YAxis yAxis = mChart.getAxisLeft();
// setting the count of Y-axis label's
yAxis.setLabelCount(12, false);
yAxis.setTextColor(Color.BLACK);
yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
yAxis.setDrawGridLines(true);

mChart.getAxisRight().setEnabled(false);
// add data
setData();
mChart.getLegend().setEnabled(false);
// refresh the chart

mChart.notifyDataSetChanged();
mChart.invalidate();


return view;
}

private void setData(){
ArrayList<Entry> values = new ArrayList<>();
**
Double d = getActivity().getIntent().getExtras().getDouble("STRING_I_NEED");
**
float myDataSet = d.floatValue();

values.add(new Entry(1,myDataSet));

LineDataSet set1;
if (mChart.getData() != null &&
mChart.getData().getDataSetCount() > 0) {
set1 = (LineDataSet) mChart.getData().getDataSetByIndex(0);
set1.setValues(values);
mChart.getData().notifyDataChanged();
mChart.notifyDataSetChanged();
} else {
set1 = new LineDataSet(values, "Blood Glucose Levels");
set1.setDrawIcons(false);
set1.setLineWidth(2f);
set1.setCircleRadius(3f);
set1.setDrawCircleHole(false);
set1.setValueTextSize(9f);
set1.setFormLineWidth(1f);
set1.setFormSize(15.f);
set1.setColor(Color.BLACK);
set1.setCircleColor(Color.BLACK);

}
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
dataSets.add(set1);
LineData data = new LineData(dataSets);
mChart.setData(data);

}
}

Tabbed.java( fragment 的基类)(仅相关代码)

 //getting inputs from room and putting them into the view in table
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mInputViewModel = ViewModelProviders.of(this).get(InputViewModel.class);
//only add if there is a new input
if (requestCode == INPUT_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
//retrieve input from room database
Input1 input1 = new Input1(data.getStringExtra(input.EXTRA_REPLY));
//insert the inputs into the view model of the recyclerView
mInputViewModel.insert(input1);
//convert the String input1 to a double
Double d = Double.parseDouble(input1.getValue());
//display pop-up if blood is above target
if (d > 8.0) {
Toast.makeText(
getApplicationContext(),
R.string.PopupHigh,
Toast.LENGTH_LONG).show();
}
//display pop-up if blood is below target
if (d < 4.0) {
Toast.makeText(
getApplicationContext(),
R.string.PopupLow,
Toast.LENGTH_LONG).show();
}
Intent i = new Intent(Tabbed.this, Graph.class);
i.putExtra("STRING_I_NEED", d);
//display pop-up if no input is added don't save the input
} else {
Toast.makeText(
getApplicationContext(),
R.string.empty_not_saved,
Toast.LENGTH_LONG).show();
}
}
public static final int INPUT_ACTIVITY_REQUEST_CODE = 1;

}

当我运行该应用程序时,它崩溃并给出此错误java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“double android.os.Bundle.getDouble(java.lang.String)”我在 Graph.java 中用 ** 标记了问题代码

正如我所说,我认为问题在于图表正在尝试在数据准备好之前构建,但我不确定如何避免此问题。

感谢您的帮助!

最佳答案

代码:

Double d = getActivity().getIntent().getExtras().getDouble("STRING_I_NEED");
float myDataSet = d.floatValue();

假设4个方法调用都返回非空值。请参阅库方法的文档,了解它们何时可能返回 null,以及一般如何避免意外情况。

文档显示 getExtras()返回

the map of all extras previously added with putExtra(), or null if none have been added.

当调用可返回 null 的库方法时,您的代码应检查 null 结果(或捕获 NullPointerException),或者确保这种情况不会发生,或两者兼而有之。

  • 由于 Intents 来自系统的其余部分,因此您无法保证它们始终具有额外内容,因此代码需要测试 getExtras() 的结果是否正确 在调用 getDouble() 之前为 null,并妥善处理。
  • 您还需要调试为什么此 Intent 没有您期望的额外内容。
  • 如果 Intent 有额外内容,但这些额外内容没有名为 "STRING_I_NEED" 的 double 值,则 getDouble("STRING_I_NEED") 将返回 0.0。您可能需要将显式 defaultValue 传递给 getDouble() 或测试 Bundle containsKey("STRING_I_NEED") >.
  • 如果您需要浮点值,请考虑调用 getFloat() 而不是 getDouble()。我认为这会将 double 值转换为 float 。

关于java - 如何防止将用户输入添加到 MPandroidchart 时出现 java.lang.nullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57939491/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com