2016-03-30 7 views
-2

Ich habe die folgende Funktion in einem großen Projekt:Java seltsam unerwartet IndexOutOfBounds

private void evalLinear(float w1, float I, int axis) { 
    try{ 
     for (i = 0; i < numPoints; i++) { 

       wv[axis][i] = wrr1[axis] - W * x[i]/L; 
       wm[axis][i] = (float) (wmm1[axis] + wrr1[axis] * x[i] - 0.5 * W * x[i] * x[i]/L); 
       wy[axis][i] = (float) (1./(6. * E * I) * (wrr1[axis]* Math.pow(x[i], 3.) - 3. * -wmm1[axis] * x[i] * x[i] - W/4. * Math.pow(x[i], 4)/L)); 
       wd[axis][i] = (float) (1./(6. * E * I) * (wrr1[axis] * 3 * Math.pow(x[i], 2.) - 6. * -wmm1[axis] * x[i] - W/4. * 4 * Math.pow(x[i], 3.)/L)); 
     } 
    }catch (IndexOutOfBoundsException e) { 
     p.println("numPoints="+numPoints); 
     p.println("i="+i+", IndexOutOfBoundsException: " + e.getMessage()); 
    } 
} 

Es lief zweimal und führt den folgenden Fehler:

numPoints=7 
i=2IndexOutOfBoundsException: 7 
numPoints=7 
i=7IndexOutOfBoundsException: 7 

ich nicht in erster Linie verstehen Wie kann ich ein IndexOutOfBounds bekommen, wenn i=2numPoints=7 ist, und dann kann ich nicht verstehen, wie i<numPoints Wert 7 nehmen kann.

EDIT

Dies ist die komplette Stacktrace

axis:0, wy.length:2 
i:7, wy[axis].length:7 
axis:0, wy.length:2 
i:7, wy[axis].length:7 
numPoints=7 
i=7, IndexOutOfBoundsException: 7 
java.lang.ArrayIndexOutOfBoundsException: 7 
    at BeamCalc.Element.evalLinear(Element.java:441) 
    at BeamCalc.Element.evalWeight(Element.java:345) 
    at BeamCalc.LoadInterface$5.actionPerformed(LoadInterface.java:137) 
    at javax.swing.JTextField.fireActionPerformed(JTextField.java:492) 
    at javax.swing.JTextField.postActionEvent(JTextField.java:705) 
    at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820) 
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1639) 
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2851) 
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2886) 
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2814) 
    at java.awt.Component.processEvent(Component.java:6066) 
    at java.awt.Container.processEvent(Container.java:2041) 
    at java.awt.Component.dispatchEventImpl(Component.java:4652) 
    at java.awt.Container.dispatchEventImpl(Container.java:2099) 
    at java.awt.Component.dispatchEvent(Component.java:4482) 
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850) 
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712) 
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990) 
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855) 
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676) 
    at java.awt.Component.dispatchEventImpl(Component.java:4524) 
    at java.awt.Container.dispatchEventImpl(Container.java:2099) 
    at java.awt.Window.dispatchEventImpl(Window.java:2478) 
    at java.awt.Component.dispatchEvent(Component.java:4482) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) 
    at java.awt.EventQueue.access$000(EventQueue.java:85) 
    at java.awt.EventQueue$1.run(EventQueue.java:603) 
    at java.awt.EventQueue$1.run(EventQueue.java:601) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
    at java.awt.EventQueue$2.run(EventQueue.java:617) 
    at java.awt.EventQueue$2.run(EventQueue.java:615) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) 
+1

was ist numpoints? ein Array eine Liste? Ich denke, du verpasst .length oder .size in deiner for-Schleife in der Frage. –

+0

Sorry numPoints ist ein Klassenattribut (Integer), sein Wert ist auf 7 festgelegt und ich habe es bis zum Ende verfolgt, es ist immer 7 – fartagaintuxedo

+2

Fügen Sie 'e.printStackTrace();' zum catch-Block hinzu, um herauszufinden, welche Zeile verursacht Ausnahme. – Evgeny

Antwort

2

OK ... lässt es so funktioniert.

wv[axis][i] = wrr1[axis] - W * x[i]/L; 
wm[axis][i] = (float) (wmm1[axis] + wrr1[axis] * x[i] - 
    0.5 * W * x[i] * x[i]/L); 
wy[axis][i] = (float) (1./(6. * E * I) * 
    (wrr1[axis]* Math.pow(x[i], 3.) - 3. * 
    -wmm1[axis] * x[i] * x[i] - W/4. * 
    Math.pow(x[i], 4)/L)); 
wd[axis][i] = (float) (1./(6. * E * I) * 
    (wrr1[axis] * 3 * Math.pow(x[i], 2.) - 6. * 
    -wmm1[axis] * x[i] - W/4. * 4 * Math.pow(x[i], 3.)/L)); 

keine Ausnahme in der ersten Aussage impliziert wv[axis][i], wrr1[axis] und x[i] in Ordnung sind.

Keine Ausnahme in der zweiten Aussage impliziert wm[axis][i] und wmm1[axis] sind auch in Ordnung.

Ausnahme in der dritten Anweisung impliziert, dass das Problem auf der LHS ist; d.h. wy[axis][i] ist fehlerhaft.

Das bedeutet, dass entweder axis >= wy.length oder i >= wy[axis].length.

Jetzt müssen Sie herausfinden, welche von denen das Problem ist, und warum es auftritt.


UPDATE

Aber dann das: Sie sagen, dass Sie diese Ausgabe von der catch-Block erhalten:

numPoints=7 
i=7IndexOutOfBoundsException: 7 

, die scheinbar unmöglich ist. Die Ausnahme IndexOutOfBoundsException wird innerhalb der Schleife geworfen (Sie sagen) und i ist nicht weniger als numPoints. Und Sie ändern weder i noch numPoints mit der Schleife.

Zeigen Sie uns den echten Code oder wurde er "sanitized"?


UPDATE 2

ich sehen, warum wir verwirrt bekommen. Die i, die Sie im Catch-Block drucken, ist NICHT die Loop-Variable. Die Schleifenvariable befindet sich an diesem Punkt außerhalb des Bereichs. Sie müssen ein Feld der umschließenden Klasse oder etwas drucken! Eigentlich noch schlimmer! Die Schleife ist nicht deklarieren die Variable i überhaupt ... so haben wir eine Schleife Variable, die ein Feld der einschließenden Klasse ist, und das möglicherweise mit anderen Methoden und/oder anderen Threads geteilt wird. BÖSE!

Und numPoints ist auch keine lokale Variable, also dass könnte auch geändert werden.

+0

Lassen Sie mich beide ... – fartagaintuxedo

+0

Ich bekomme diese "Achse: 1, wy.length: 2'" i: 7, wy [Achse] .Länge: 7' So ist das Problem mit dem "i". Aber ich kann nicht verstehen, wie ich den gleichen Wert wie das For-Schleife-Limit nehmen kann. 'i == numPoints', wenn das Limit der Schleife 'i fartagaintuxedo

+0

Ich weiß, ich bin verrückt, das was ich zeige ist der echte Code, genau kopiert vom Original eingefügt. Es gehört zu einem großen Projekt, also vielleicht gibt es etwas, das sich einmischt, aber es erscheint mir auch total unmöglich. – fartagaintuxedo