如何解决调用虚拟方法的尝试';void android.widget.TextView.setText(java.lang.CharSequence)和#x27;关于空对象引用
我在运行应用程序时遇到此错误。我不知道该怎么办 这是我的MainActivity.java如何解决调用虚拟方法的尝试';void android.widget.TextView.setText(java.lang.CharSequence)和#x27;关于空对象引用,java,android,Java,Android,我在运行应用程序时遇到此错误。我不知道该怎么办 这是我的MainActivity.java package com.example.user.sensor; import android.content.Context; import android.content.DialogInterface; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.S
package com.example.user.sensor;
import android.content.Context;
import android.content.DialogInterface;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private float lastX = 0, lastY = 0, lastZ = 0;
private SensorManager sensorManager;
private Sensor accelerometer;
private float deltaXMax = 0;
private float deltaYMax = 0;
private float deltaZMax = 0;
private float deltaX = 0;
private float deltaY = 0;
private float deltaZ = 0;
private float vibrateThreshold = 0;
TextView currentX, currentY, currentZ;
public Vibrator v;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().getThemedContext();
AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext(), android.R.style.Theme_Material_Dialog_Alert);
} else {
builder = new AlertDialog.Builder(getSupportActionBar().getThemedContext());
}
builder.setTitle("Alert Dialog")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) {
// success! we have an accelerometer
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
vibrateThreshold = accelerometer.getMaximumRange() / 2;
} else {
// fai! we dont have an accelerometer!
}
//initialize vibration
v = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
}
//onResume() register the accelerometer for listening the events
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
//onPause() unregister the accelerometer for stop listening the events
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
// clean current values
displayCleanValues();
// display the current x,y,z accelerometer values
displayCurrentValues();
// display the max x,y,z accelerometer values
// get the change of the x,y,z values of the accelerometer
deltaX = Math.abs(lastX - event.values[0]);
deltaY = Math.abs(lastY - event.values[1]);
deltaZ = Math.abs(lastZ - event.values[2]);
// if the change is below 2, it is just plain noise
if (deltaX < 2)
deltaX = 0;
if (deltaY < 2)
deltaY = 0;
if (deltaZ > (vibrateThreshold) || (deltaY > vibrateThreshold) || (deltaZ > vibrateThreshold)) {
v.vibrate(50);
}
}
public void displayCleanValues() {
currentX.setText("0.0");
currentY.setText("0.0");
currentZ.setText("0.0");
}
// display the current x,y,z accelerometer values
public void displayCurrentValues() {
currentX.setText(Float.toString(deltaX));
currentY.setText(Float.toString(deltaY));
currentZ.setText(Float.toString(deltaZ));
}
}
// display the max x,y,z accelerometer values
package com.example.user.sensor;
导入android.content.Context;
导入android.content.DialogInterface;
导入android.hardware.Sensor;
导入android.hardware.SensorEvent;
导入android.hardware.SensorEventListener;
导入android.hardware.SensorManager;
导入android.os.Build;
导入android.os.Bundle;
导入android.os.可控震源;
导入android.support.v7.app.AlertDialog;
导入android.support.v7.app.AppActivity;
导入android.widget.TextView;
公共类MainActivity扩展AppCompatActivity实现SensorEventListener{
私有浮点lastX=0,lastY=0,lastZ=0;
私人传感器管理器传感器管理器;
专用传感器加速度计;
私有浮动deltaXMax=0;
私有浮动deltaYMax=0;
私有浮动deltaZMax=0;
个人所得税=0;
私人浮动三角洲=0;
私有浮动deltaZ=0;
私有浮动阈值=0;
text查看当前X、当前Y、当前Z;
公营机构v ;;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().getThemedContext();
AlertDialog.Builder;
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.LOLLIPOP){
builder=新建AlertDialog.builder(getSupportActionBar().getThemedContext(),android.R.style.Theme\u Material\u Dialog\u Alert);
}否则{
builder=新建AlertDialog.builder(getSupportActionBar().getThemedContext());
}
builder.setTitle(“警报对话框”)
.setPositiveButton(android.R.string.yes,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
}
})
.setIcon(android.R.drawable.ic_对话框_警报)
.show();
sensorManager=(sensorManager)getSystemService(Context.SENSOR\u服务);
if(sensorManager.getDefaultSensor(Sensor.TYPE_Accelerator)!=null){
//成功!我们有一个加速计
加速计=sensorManager.getDefaultSensor(传感器类型\加速计);
sensorManager.registerListener(此,加速计,sensorManager.SENSOR\u延迟\u正常);
振动阈值=加速计。getMaximumRange()/2;
}否则{
//fai!我们没有加速度计!
}
//初始化振动
v=(可控震源)this.getSystemService(Context.可控震源\u服务);
}
//onResume()注册用于侦听事件的加速计
受保护的void onResume(){
super.onResume();
sensorManager.registerListener(此,加速计,sensorManager.SENSOR\u延迟\u正常);
}
//onPause()注销加速计以停止侦听事件
受保护的void onPause(){
super.onPause();
sensorManager.UnregistereListener(此);
}
@凌驾
精度更改时的公共无效(传感器,int精度){
}
@凌驾
传感器更改时的公共无效(传感器事件){
//清洁电流值
displayCleanValues();
//显示当前的x、y、z加速度计值
显示当前值();
//显示最大x、y、z加速度计值
//获取加速度计的x、y、z值的变化
deltaX=Math.abs(lastX-event.values[0]);
deltaY=Math.abs(lastY-event.values[1]);
deltaZ=Math.abs(lastZ-event.values[2]);
//如果变化小于2,那就是纯噪音
如果(deltaX<2)
deltaX=0;
如果(三角洲<2)
deltaY=0;
如果(deltaZ>(振动阈值)| |(deltaY>振动阈值)| |(deltaZ>振动阈值)){
v、 振动(50);
}
}
public void displayCleanValues(){
currentX.setText(“0.0”);
当前设置文本(“0.0”);
当前z.setText(“0.0”);
}
//显示当前的x、y、z加速度计值
public void displayCurrentValues(){
currentX.setText(Float.toString(deltaX));
currentY.setText(Float.toString(deltaY));
currentZ.setText(Float.toString(deltaZ));
}
}
//显示最大x、y、z加速度计值
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:layout_marginLeft="15dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GYROSCOPE"
android:textColor="@android:color/black"
android:layout_marginTop="30dp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="8dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="X :"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:layout_marginLeft="10dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Y :"
android:layout_marginTop="4dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:layout_marginLeft="10dp"
android:layout_marginTop="4dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Z :"
android:layout_marginTop="4dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:layout_marginLeft="10dp"
android:layout_marginTop="4dp"
/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACCELEROMETER"
android:textColor="@android:color/black"
android:layout_marginTop="30dp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="8dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="X :"
/>
<TextView
android:id="@+id/currentX"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:layout_marginLeft="10dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Y :"
android:layout_marginTop="4dp"
/>
<TextView
android:id="@+id/currentY"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:layout_marginLeft="10dp"
android:layout_marginTop="4dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Z :"
android:layout_marginTop="4dp"
/>
<TextView
android:id="@+id/currentZ"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:layout_marginLeft="10dp"
android:layout_marginTop="4dp"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
下面是日志文件:
E/AndroidRuntime:致命异常:主
进程:com.example.user.sensor,PID:8586
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”
位于com.example.user.sensor.MainActivity.displayCleanValues(MainActivity.java:121)
位于com.example.user.sensor.MainActivity.onSensorChanged(MainActivity.java:100)
位于android.hardware.SystemSensorManager$SensorEventQueue.dispatchSensorEvent(SystemSensorManager.java:830)
在android.os.MessageQueue.nativePollOnce(本机方法)
下一步(MessageQueue.java:325)
位于android.os.Looper.loop(Looper.java:142)
位于android.app.ActivityThread.main(ActivityThread.java:6494)
位于java.lang.reflect.Method.invoke(本机方法)
<TextView
android:id="@id/txt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GYROSCOPE"
android:textColor="@android:color/black"
android:layout_marginTop="30dp"
/>
TextView txt1, txt2;
txt1 = (TextView) findViewById(R.id.txt1);// R.id.txt1 is a layout textbox ID