求助 小白debug不到是哪空指针了。 2C

public class MainActivity extends Activity {
private GraphicalView chart;

private Timer timer = new Timer();
private TimerTask task;
private Float addY;
private String addX;
Tool_Sqls mysql = new Tool_Sqls();

String[] xkedu = new String[20] ;//x轴数据缓冲

Float[] ycache = new Float[20];
//private final static int SERISE_NR = 1; //曲线数量
private XYSeries series;//用来清空第一个再加下一个
private XYMultipleSeriesDataset dataset1;//xy轴数据源
private XYMultipleSeriesRenderer render;
SimpleDateFormat   shijian   =   new   SimpleDateFormat("hh:mm:ss"); 

Handler handler2;
TextView guangzhi2;

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.guangzhao);  
    //guangzhi2=(TextView)findViewById(R.id.guangzhi2);

    //制作曲线图
    LinearLayout linearLayout = (LinearLayout)findViewById(R.id.guangzhexian);
    chart = ChartFactory.getLineChartView(this, getdemodataset(), getdemorenderer());
    linearLayout.removeAllViews();//先remove再add可以实现统计图更新
    linearLayout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT));
    handler2 = new Handler(){
        public void handleMessage(Message msg) {
        updatechart();
        //guangzhi2.setText(String.valueOf(addY));
        }

    };
    task = new TimerTask(){
       public void run() {
           Message msg=new Message();
           msg.what=200;
           handler2.sendMessage(msg);     
       }
   };
   timer.schedule(task, 0, 2000);

}//oncreate结束

//更新折线图
private void updatechart() {
    //判断当前点集中到底有多少点,因为屏幕总共只能容纳20个,所以当点数超过20时,长度永远是20
    int length=series.getItemCount();
    int a=length;

    if(length>20){
        length=20;
    }

// try {
// if(guangzhi2.getText().toString()!=null){
// addY = Float.valueOf(guangzhi2.getText().toString());//要不要判断再说
// }
// } catch (NumberFormatException e) {
// e.printStackTrace();
// }
addX=shijian.format(new java.util.Date());
try {
mysql.getROID_4("hoestry2","id");

        while (mysql.rs.next()) {
            addY = Float.valueOf(mysql.rs.getFloat("outlet_temperature"));//(float)(Math.random()*10);
        }
        mysql.rs.close();
        mysql.stmt.close();
        mysql.con.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    //移除数据集中旧的点集
    dataset1.removeSeries(series);
    if(a<20)//当数据集中不够20个点的时候直接添加就好,因为初始化的时候只有一个点,所以前几次更新的时候直接添加
    {
        series.add(a+1, addY);//第一个参数代表第几个点,要与下面语句中的第一个参数对应
        render.addXTextLabel(a+1, addX);
        xkedu[a]=addX;
    }
    else //超过了20个点要去除xcache【0】换成【1】的.....
    {
        //将旧的点集中x和y的数值取出来放入backup中,造成曲线向左平移的效果
        for(int i =0 ;i<length-1;i++){
            ycache[i]=(float) series.getY(i+1);
            xkedu[i]=xkedu[i+1];
        }

        //点集先清空,为了做成新的点集而准备
        series.clear();
         //将新产生的点首先加入到点集中,然后在循环体中将坐标变换后的一系列点都重新加入到点集中

        for(int k =0 ;k<length-1;k++){
            series.add(k+1, ycache[k]);
            render.addXTextLabel(k+1, xkedu[k]);
        }
        xkedu[4]=addX;
        series.add(20, addY);
        render.addXTextLabel(20, addX);
    }    
     //在数据集中添加新的点集
    dataset1.addSeries(series);
     //视图更新,没有这一步,曲线不会呈现动态
    chart.invalidate();
}

private XYMultipleSeriesRenderer getdemorenderer() {
    // TODO Auto-generated method stub
    render = new XYMultipleSeriesRenderer();
    render.setChartTitle("三新锅炉温度曲线图");
    render.setChartTitleTextSize(20);//设置整个图表标题文字的大小
    render.setAxisTitleTextSize(16);//设置轴标题文字的大小
    render.setAxesColor(Color.BLACK);
    render.setXTitle("时间/hh:mm:ss");
    render.setYTitle("温度/℃");

    render.setLabelsTextSize(16);//设置轴刻度文字的大小
    render.setLabelsColor(Color.BLACK);
    render.setXLabelsColor(Color.BLACK);
    render.setYLabelsColor(0, Color.BLACK);
    render.setLegendTextSize(15);//设置图例文字大小  
    //render.setShowLegend(false);//显示不显示在这里设置,非常完美

    XYSeriesRenderer r = new XYSeriesRenderer();//设置颜色和点类型
    r.setColor(Color.RED);
    r.setPointStyle(PointStyle.CIRCLE);
    r.setFillPoints(true);
    r.setChartValuesSpacing(3);

    render.addSeriesRenderer(r);
    render.setYLabelsAlign(Align.RIGHT);//刻度值相对于刻度的位置
    render.setShowGrid(true);//显示网格
    render.setYAxisMax(60);//设置y轴的范围
    render.setYAxisMin(-10);
    render.setYLabels(20);//设置Y轴标签数
    render.setDisplayChartValues(true);//设置Y轴曲线上的点的数值是否显示,实测当点数密集的时候不会全部显示,会隔一段时间显示


    render.setInScroll(true);
    render.setLabelsTextSize(14);
    render.setLabelsColor(Color.BLACK);
    //render.getSeriesRendererAt(0).setDisplayChartValues(true); //显示折线上点的数值
    render.setPanEnabled(false,false);//禁止报表的拖动
    render.setPointSize(5f);//设置点的大小(图上显示的点的大小和图例中点的大小都会被设置)
    render.setMargins(new int[]{40,40,40,40}); //设置图形四周的留白
    render.setMarginsColor(Color.WHITE);
    render.setXLabels(0);// 取消X坐标的数字zjk,只有自己定义横坐标是才设为此值



    return render;
}

private XYMultipleSeriesDataset getdemodataset() {
    // TODO Auto-generated method stub
     dataset1=new XYMultipleSeriesDataset();//xy轴数据源
    series = new XYSeries("矿大温度 ");//这个事是显示多条用的,显不显示在上面render设置
    //这里相当于初始化,初始化中无需添加数据,因为如果这里添加第一个数据的话,
    //很容易使第一个数据和定时器中更新的第二个数据的时间间隔不为两秒,所以下面语句屏蔽
    //这里可以一次更新五个数据,这样的话相当于开始的时候就把五个数据全部加进去了,但是数据的时间是不准确或者间隔不为二的
    //for(int i=0;i<5;i++)
    //series.add(1, Math.random()*10);//横坐标date数据类型,纵坐标随即数等待更新


     dataset1.addSeries(series);
    return dataset1;
}

 public void onDestroy() {
         //当结束程序时关掉Timer
         timer.cancel();
         super.onDestroy();
        }

}


8个回答

log信息如下:图片说明

106:addY = Float.valueOf(mysql.rs.getFloat("outlet_temperature"));
但是不知道是咋空的。求指点。

mysql.rs.getFloat("outlet_temperature");应该是这里面报空了

Anthing_is_possible
HaoKe_kill 回复XieChaoAndroid: 数据库没问题 工具类也没问题 权限也加了 不知道啥原因
接近 3 年之前 回复
Anthing_is_possible
HaoKe_kill 回复XieChaoAndroid: 嗯 是这行报错了 但就是不知道为啥
接近 3 年之前 回复

106:addY = Float.valueOf(mysql.rs.getFloat("outlet_temperature"));里面有两个地方可能报空
1、rs报空(mysql是new的所以不存在null)
2、mysql.rs.getFloat("outlet_temperature")这个取出来的值为空,那么自动拆装箱时报空

gelangqing
gelangqing 回复anthing_is_possible建议你步进debug一下,看一下取得的数据。java底层很多都是直接抛出异常,这就意味着尽管你的表里有数据,有时得到的也可能会是null。你要先确认表中是有数据的,即便数据类型是double,那么数据也必须要显式的写出,程序是不会将表中没有显式写出的数据自动转换成0.0的。
接近 3 年之前 回复
Anthing_is_possible
HaoKe_kill 回复gelangqing: 自动拆装箱?意思思转换成空了?表里只有数据的 double类型
接近 3 年之前 回复

你把后边的两句分开然后debug就找到答案了

loat.valueOf(mysql.rs.getFloat("outlet_temperature"))分开写,再debug试试

series好像没初始化?

一步一步debug再细一些 然后看哪崩了再研究吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问