1

我正在使用AChartEngine构建一个 Android 应用程序并且遇到奇怪的错误。

在我向我已经建立的图表中添加新点并触摸/平移图表后,我得到一个NullPointerExceptionin LineChart(XYChart).getSeriesAndPointForScreenCoordinate(Point),其中GraphicalView的变量oldX并且oldY被发现为空。这些变量设置在 中GraphicalView.onTouchEvent(),但显然没有被调用。

有没有办法onTouchEvent()在初始化我的图表时手动触发,或者有没有解决这个错误的方法?

这是我的图表设置代码:

mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);
mChartView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();
        double[] xy = mChartView.toRealPoint(0);
        if (seriesSelection == null) {
            Toast.makeText(viewer.this,
                    "No chart element was clicked",
                    Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(
                    viewer.this,
                    "Chart element clicked", Toast.LENGTH_SHORT)
                    .show();
        }
    }
});

这是我添加新点的方法:

protected class NewPoints extends AsyncTask<Double, Void, Void> {
    @Override
    protected Void doInBackground(Double... values) {
        mCurrentSeries.add(values[0], values[1]); // x, y

        if (mChartView != null) {
            mChartView.repaint();
        }
        return null;
    }
}

我的测试代码:

for(double i = 0; i < 10; i++) {
    new NewPoints().execute(i, Math.log(i));
}

这是 LogCat 输出:

07-20 18:46:12.570: E/AndroidRuntime(13800): FATAL EXCEPTION: main
07-20 18:46:12.570: E/AndroidRuntime(13800): java.lang.NullPointerException
07-20 18:46:12.570: E/AndroidRuntime(13800):    at org.achartengine.chart.XYChart.getSeriesAndPointForScreenCoordinate(XYChart.java:840)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at org.achartengine.GraphicalView.getCurrentSeriesAndPoint(GraphicalView.java:135)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at com.maximz.viewer$1.onClick(viewer.java:185)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at android.view.View.performClick(View.java:3511)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at android.view.View$PerformClick.run(View.java:14110)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at android.os.Handler.handleCallback(Handler.java:605)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at android.os.Looper.loop(Looper.java:137)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at android.app.ActivityThread.main(ActivityThread.java:4424)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at java.lang.reflect.Method.invokeNative(Native Method)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at java.lang.reflect.Method.invoke(Method.java:511)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-20 18:46:12.570: E/AndroidRuntime(13800):    at dalvik.system.NativeStart.main(Native Method)

更新1:

我用 AChartEngine 源代码重新编译,调试显示错误发生在这个方法中:

public SeriesSelection getSeriesAndPointForScreenCoordinate(final Point screenPoint) {
    if (clickableAreas != null)
      for (int seriesIndex = clickableAreas.size() - 1; seriesIndex >= 0; seriesIndex--) {
        // series 0 is drawn first. Then series 1 is drawn on top, and series 2
        // on top of that.
        // we want to know what the user clicked on, so traverse them in the
        // order they appear on the screen.
        int pointIndex = 0;
        if (clickableAreas.get(seriesIndex) != null) {
          RectF rectangle;
          for (ClickableArea area : clickableAreas.get(seriesIndex)) {
            rectangle = area.getRect(); // EXCEPTION HERE: area is null
            if (rectangle != null && rectangle.contains(screenPoint.getX(), screenPoint.getY())) {
              return new SeriesSelection(seriesIndex, pointIndex, area.getX(), area.getY());
            }
            pointIndex++;
          }
        }
      }
    return super.getSeriesAndPointForScreenCoordinate(screenPoint);
  }

异常被抛出该rectangle = area.getRect();行,其中area为 null 因为clickableAreas.get(0)以某种方式返回 null clickableAreas 的集合

我将尝试通过检查 clickableArea 是否为空来修补它,但这引出了一个问题:我是否正确添加了点?

4

2 回答 2

1

根据堆栈跟踪,异常发生在以下 XYChart.java 代码的第二行(如果我的源代码具有匹配的行号):

for (ClickableArea area : clickableAreas.get(seriesIndex)) {
    rectangle = area.getRect();  // <--- Exception here!
    if (rectangle != null && rectangle.contains(screenPoint.getX(), screenPoint.getY())) {
        return new SeriesSelection(seriesIndex, pointIndex, area.getX(), area.getY());
    }
    pointIndex++;
}

我看不出这怎么会发生。

你能用 AChartEngine 的源代码编译你的代码并调试吗?

此外oldX&在 GraphicalView.javaoldY中都被声明为原始s。如果他们是原始人,他们float怎么可能呢?null

于 2012-07-22T13:28:16.913 回答
0

空指针异常可能是由于您的 AchartEngine jar 文件有时会在不再使用时停止使用。因此,您应该通过右键单击您的项目来检查构建路径上的 jar 文件。从中选择选项

    Order and Export->choose your jar files->click up and down button. 

它可用于打开项目中使用的 jar 文件。

于 2012-07-21T05:55:53.757 回答