Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当循环/索引超出边界时陷入异常_Java_Android_While Loop_Sensors - Fatal编程技术网

Java 当循环/索引超出边界时陷入异常

Java 当循环/索引超出边界时陷入异常,java,android,while-loop,sensors,Java,Android,While Loop,Sensors,我正试图找出一个步骤何时发生。为此,我编写了一个名为countSteps的方法。它的问题是,我陷入了它,因为随着while循环,我不断获得新的数据,我认为它永远不会回到onSensor。我还收到一个名为indexoutofboundsexception的错误:无效索引2,大小为2 所以我的第一个问题是,有没有其他方法可以实现我没有while循环的方法?第二个问题是如何修复indexoutofboundsexception。 公共类MainActivity扩展活动实现SensorEventList

我正试图找出一个步骤何时发生。为此,我编写了一个名为countSteps的方法。它的问题是,我陷入了它,因为随着while循环,我不断获得新的数据,我认为它永远不会回到onSensor。我还收到一个名为indexoutofboundsexception的错误:无效索引2,大小为2

所以我的第一个问题是,有没有其他方法可以实现我没有while循环的方法?第二个问题是如何修复indexoutofboundsexception。 公共类MainActivity扩展活动实现SensorEventListener{

    private SensorManager mSensorManager;
    private Sensor mRotationVector;
    private Sensor mAccelerometer;
    private TextView mTextView4;
    private TextView mTextView5;
    private TextView mTextView6;
    private TextView mTextView7;
    private TextView mTextView8;
    float a, b, c, d, x, y, z, xyz;
    float[] retVals = new float[3];
    float avg = 10;
    float factor = (float) 1.15;
    ArrayList<Float> accelData = new ArrayList<Float>();
    public int peakCounter = 0;
    public int underAvgCounter = 0;

    public void countSteps() {
        int n = 0;
        float controlPoint = accelData.get(0);
        while (accelData.iterator().hasNext()) {
            if (accelData.get(n) != accelData.get(n + 1)) {
                if (accelData.get(n) > accelData.get(n + 1)) {
                    if (accelData.get(n) < controlPoint) {
                        n++;
                    } else {
                        if (accelData.get(n) < avg * factor) {
                            underAvgCounter++;
                        }
                        peakCounter++;
                        n++;
                    }
                } else {
                    controlPoint = accelData.get(n + 1);
                    n++;
                }
            } else {
                n++;
            }
            peakCounter -= underAvgCounter;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView4 = (TextView) findViewById(R.id.textView4);
        mTextView5 = (TextView) findViewById(R.id.textView5);
        mTextView6 = (TextView) findViewById(R.id.textView6);
        mTextView7 = (TextView) findViewById(R.id.textView7);
        mTextView8 = (TextView) findViewById(R.id.textView8);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mAccelerometer = mSensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        accelData.add((float) 0);
    }

    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this, mAccelerometer,
                SensorManager.SENSOR_DELAY_GAME);
    }

    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

    @Override
    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 void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
            x = event.values[0];
            y = event.values[1];
            z = event.values[2];
            xyz = (float) Math.sqrt((x * x) + (y * y) + (z * z));
            accelData.add(xyz);
            mTextView7.setText("magnitude accel " + xyz);
            countSteps();
            mTextView8.setText("steps " + peakCounter);

    }
}
专用传感器管理器mSensorManager;
专用传感器旋转矢量;
专用传感器mAccelerometer;
私有文本视图mTextView4;
私有文本视图mTextView5;
私有文本视图mTextView6;
私有文本视图mTextView7;
私有文本视图mTextView8;
浮点数a、b、c、d、x、y、z、xyz;
float[]retVals=新的float[3];
浮动平均值=10;
浮动系数=(浮动)1.15;
ArrayList accelData=新的ArrayList();
公共整数峰值计数器=0;
avgcounter下的公共int=0;
公共步骤(){
int n=0;
浮点控制点=accelData.get(0);
while(accelData.iterator().hasNext()){
如果(accelData.get(n)!=accelData.get(n+1)){
if(accelData.get(n)>accelData.get(n+1)){
if(加速度数据获取(n)<控制点){
n++;
}否则{
if(加速度数据获取(n)
如果集合中至少有1个元素,则始终为true

  • accelData.iterator()
    每次创建新的迭代器
  • accelData.iterator().hasNext()
    每次都会检查集合中的第一个元素
  • n++将一直执行到结束,并且
  • accelData.get(n+1)
    throws
    IndexOutOfBoundsException
  • 您可以做的一件事是为
    循环使用

     for (int n = 0; n < accelData.size() - 1; n++) {  // size-1 is used since you're accessing n+1 index
         if (accelData.get(n) != accelData.get(n + 1)) {
             if (accelData.get(n) > accelData.get(n + 1)) {
                    if (accelData.get(n) >= controlPoint) {
                        if (accelData.get(n) < avg * factor) {
                            underAvgCounter++;
                        }
                        peakCounter++;                        
                    }
            } else {
                controlPoint = accelData.get(n + 1);
            }
        } 
    }
    peakCounter -= underAvgCounter;
    
    因为您正在访问n+1索引,所以使用了for(int n=0;naccelData.get(n+1)){ 如果(accelData.get(n)>=控制点){ if(加速度数据获取(n)
    对于IndexOutOfBounds,以下代码段是一个问题:

    accelData.get(n)和accelData.get(n+1)

    您正在检查迭代器().hasNext(),但它不能保证n+1元素的存在

    无限循环,我认为是因为您从未使用迭代器().next()遍历下一个元素。为了更好地理解,请参考一个简单的迭代器代码


    您可以在java中使用任何循环技术,如for、do-while、while和advanced-for循环,这并不重要。重要的是你是否能有效地完成它,它是否可读。

    哦,谢谢。这是有道理的。我尝试了for循环,我的峰值计数器值一直在下降。我认为underAvgCounter一直在增加,peakCounter一直在下降。请看我编辑的答案,我添加了for循环,并删除了代码中的所有
    n++
    ,我正在尝试实现此算法-。我不知道为什么peakCounter不会增加。我明白了,问题是您有'peakCounter-=underAvgCounter;'在回路内部,但必须在外部。我在回答中已经纠正了这个问题嗯,我似乎仍然有这个问题。。peakCoun的值
     while (accelData.iterator().hasNext()) {
    
     for (int n = 0; n < accelData.size() - 1; n++) {  // size-1 is used since you're accessing n+1 index
         if (accelData.get(n) != accelData.get(n + 1)) {
             if (accelData.get(n) > accelData.get(n + 1)) {
                    if (accelData.get(n) >= controlPoint) {
                        if (accelData.get(n) < avg * factor) {
                            underAvgCounter++;
                        }
                        peakCounter++;                        
                    }
            } else {
                controlPoint = accelData.get(n + 1);
            }
        } 
    }
    peakCounter -= underAvgCounter;