【问题标题】:Nullpointerexception when I try to update in android [duplicate]当我尝试在android中更新时出现Nullpointerexception [重复]
【发布时间】:2015-04-26 09:27:31
【问题描述】:

我在尝试更新表格时遇到问题。但是问题不在于语句sql,是调用方法进行更新。 这是执行操作的按钮代码

public void onClick(View v) 
{
    switch (v.getId())
    {
    case R.id.btnsave:
        String id="Act1";           
        datos.Actualizar(id,punactfis);
        Toast.makeText(MainProgreso.this, "Bien Hecho", Toast.LENGTH_SHORT).show();
        datos.close();
    }
}   

代码方法Actualizar

public void Actualizar(String id, int puntos)
{
    Log.i("Variables", id);
    String query="UPDATE Actividades SET puntos="+puntos+" ,total_puntos=total_puntos"+puntos+" WHERE id_actividad="+id+";";
    Log.i("Consulta", query);
    db.execSQL(query);
}

这是日志

02-24 15:07:00.474: E/AndroidRuntime(858): 致命异常: main 02-24 15:07:00.474: E/AndroidRuntime(858): java.lang.NullPointerException 02-24 15:07:00.474: E/AndroidRuntime(858): at com.example.app8semanas.MainProgreso.onClick(MainProgreso.java:133) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 android.view.View.performClick(View.java:3480) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 android.view.View$PerformClick.run(View.java:13983) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 android.os.Handler.handleCallback(Handler.java:605) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 android.os.Handler.dispatchMessage(Handler.java:92) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 android.os.Looper.loop(Looper.java:137) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 android.app.ActivityThread.main(ActivityThread.java:4340) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 java.lang.reflect.Method.invokeNative(Native Method) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 java.lang.reflect.Method.invoke(Method.java:511) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 02-24 15:07:00.474: E/AndroidRuntime(858): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 02-24 15:07:00.474: E/AndroidRuntime(858): at dalvik.system.NativeStart.main(Native Method)

感谢您的帮助。

类的所有代码

public class MainProgreso extends Activity implements OnClickListener, OnCheckedChangeListener {
private TabHost th;
private TextView dia;
private RadioGroup rg1, rg2, rg3;   
private ImageButton btns1, btns2, btns3;

String fecha;
int punactfis, punfrve, pundor;
OperacionesBD datos;
protected void onCreate(Bundle savedInstanceState) 
{       
    super.onCreate(savedInstanceState);
    setContentView(R.layout.progreso);

    fecha = getIntent().getStringExtra("fecha");
    dia=(TextView)findViewById(R.id.txt2);
    dia.setText(fecha);

    rg1=(RadioGroup)findViewById(R.id.rgactfis);
    rg2=(RadioGroup)findViewById(R.id.rgfruveg);
    rg3=(RadioGroup)findViewById(R.id.rgdormir);
    rg1.setOnCheckedChangeListener(this);
    rg2.setOnCheckedChangeListener(this);
    rg3.setOnCheckedChangeListener(this);

    btns1=(ImageButton)findViewById(R.id.btnsave);
    btns2=(ImageButton)findViewById(R.id.btnsave1);
    btns3=(ImageButton)findViewById(R.id.btnsave2);
    btns1.setOnClickListener(this);
    btns2.setOnClickListener(this);
    btns3.setOnClickListener(this);

    th=(TabHost)findViewById(android.R.id.tabhost);     
    th.setup();     

    TabSpec ts1=th.newTabSpec("Tab1");
    ts1.setIndicator("Actividad_Fisica");
    ts1.setContent(R.id.tab1);  
    th.addTab(ts1);

    TabSpec ts2=th.newTabSpec("Tab2");
    ts2.setIndicator("Frutas_Verduras");
    ts2.setContent(R.id.tab2);              
    th.addTab(ts2);

    TabSpec ts3=th.newTabSpec("Tab3");
    ts3.setIndicator("Sueño");
    ts3.setContent(R.id.tab3);      
    th.addTab(ts3);

}

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) 
{
    switch(checkedId)
    {
    case R.id.rbaf1:
        punactfis=2;
        break;
    case R.id.rbaf2:
        punactfis=4;
        break;
    case R.id.rbaf3:
        punactfis=6;
        break;
    case R.id.rbaf4:
        punactfis=8;
        break;
    }
    switch(checkedId)
    {
    case R.id.rbfv1:
        punfrve=3;
        break;
    case R.id.rbfv2:
        punfrve=0;
        break;
    }
    switch (checkedId)
    {
    case R.id.rbd1:
        pundor=3;
        break;
    case R.id.rbd2:
        pundor=0;
        break;
    }
}

@Override
public void onClick(View v) 
{
    switch (v.getId())
    {
    case R.id.btnsave:
        String  query="UPDATE Actividades SET puntos="+punactfis+" ,total_puntos=total_puntos"+punactfis+" WHERE id_actividad=Act1;";           
        datos.InsertarMeta(query);
        Toast.makeText(MainProgreso.this, "Bien Hecho", Toast.LENGTH_SHORT).show();
        datos.close();
    }
}   

}

【问题讨论】:

  • 你初始化了datos对象了吗? datos = new xy?
  • 您是否有理由不简单地使用update() 方法?您至少应该考虑使用参数化查询来防止 SQLInjection。
  • 是的,datos 对象已被初始化。而我不使用更新方法的原因是因为字段正在使用数学运算进行更新。

标签: android sqlite methods nullpointerexception


【解决方案1】:

似乎“datos”为空。你创建了这个对象吗?

顺便说一句,考虑绑定你的 sql 参数。

【讨论】:

  • 是的,我创建了对象。
  • 好吧,您没有说明哪一行代码引发了异常,但它在 onClick 方法中,我唯一能想到的就是如果 datos 为 null 或 v 时会引发 NPE为空,并且永远不会为空视图调用 onClick。您能否添加有关哪一行引发异常的信息?
  • 抛出异常的行是这个 datos.InsertarMeta(query);
  • 这强烈表明“datos”为空,就像我在回答中建议的那样,这被否决了。查看您添加的代码,很明显 datos 从未分配给任何对象。没有“datos = new OperacionesDB”或类似内容。但是您在上面声明您确实创建了对象..?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多