Problem mit IndexOutOfBoundsException

  • 13 Antworten
  • Letztes Antwortdatum
B

Benzko

Neues Mitglied
0
Hallo,

ich bin neu hier im Forum und in Sachen programmieren noch ziemlich unerfahren.
ich bekomme bei dem folgenden Code immer den Fehler: java.lang.IndexOutOfBoundsException

Ist die Url zu lang? Mein Tab hat Version 4.1.2. Meine Programm Target-Version ist 1.6.

Bei meinem alten Smartphone mit einer älteren Version hat dieser Code damals
funktioniert.

Liegt es hier an der Android Version?



package com.example.test_v1;


import java.net.URL;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final Button button = (Button) findViewById(R.id.btnSave);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try{
URL page = new URL("http://192.168.2.5/WRITEPI?ADR1=MX0.1&VALUE1=1&FORMAT1=%d");
System.out.println (page);
page.getContent();


}catch (Exception e){System.out.println (e);}
}
});
}


}


Danke schon mal im Voraus für jede Hilfe.
 
Kannst du mir noch sagen in welcher Codezeile der Fehler auftauch? Ich sehe da gerade irgendwie gar nichts was "OutOfBounds" sein könnte.
 
Hi,

in der Zeile: URL page = new URL("http://192.168.2.5/WRITEPI?ADR1=MX0.1&VALUE1=1&FORMAT1=%d");

Ich hab auch keine Ahnung woran es liegen könnte. Öffnen die neueren Versionen nicht mehr so lange Url's?
 
Kannste du mal die komplette Fehlermeldung inkl Stacktrace posten?

Ich sehe in dem Code oben eigentlich auch keine Stelle an der diese Exception fliegen kann.

Es könnte an dem =%d liegen.
Ich bin mir gerade nicht sicher wie Java das umwandelt.
Aber das % Zeichen wird ja normalerweise für das URL-encoding genutzt allerdings ist %d kein Zeichen das umgewandelt werden könnte.
 
Hmmm...also eigentlich sollte die URL Länge egal sein. Aber IndexOutOfBounds sagt aus, dass man irgendwo versucht auf z.B. das 6te Element zuzugreifen, es aber nur 5 gibt.

Kannst du mal bitte den Log komplett posten bzw. das drumherum?

EDIT: Ja....hallo amfa, da warst du wohl ein paar Sekunden schneller :D
 
Zuletzt bearbeitet:
Hier die komplette LogCat:

01-08 19:18:03.210: I/System.out(13756): http://192.168.2.5/WRITEPI?ADR1=MX0.1&VALUE1=1&FORMAT1=%d
01-08 19:18:03.210: I/System.out(13756): java.lang.IndexOutOfBoundsException
01-08 19:18:03.578: D/STATUSBAR-NetworkController(463): refreshSignalCluster: data=0 bt=false
01-08 19:18:03.750: D/SensorService(370): AutoRotationSensor::process: Acc eventTimestamp = 0, previousAccTimestamp = 106805768, difference = 43092
01-08 19:18:03.937: I/audio_hw_mrvl(104): hardware output set_standby
01-08 19:18:03.937: I/MarvellAmixer(104): get_amixer_value, device 2, left volume 0, right volume 0, codec info 0, mic mode 1
01-08 19:18:03.937: D/MarvellAmixer(104): get_amixer_value: Set codec as slave
01-08 19:18:03.937: I/AudioHIFIPath(104): default_disable: Disable hifi output device speaker
01-08 19:18:03.937: D/ALSA_PLUGIN--CTRL_CODEC(104): Disable path HiFiPlayToStereoSPKR, value is 0x00350000
01-08 19:18:03.937: I/acm_aph(104): voice_path_active=0
01-08 19:18:03.937: I/acm_aph(104): ACM_APHPathHandling: path=HiFiPlayToStereoSPKR operation=DISABLE ref_path=(null) amixer value=0x0
01-08 19:18:03.937: I/acm_aph(104): _get_gain_value: req volume=0, nearest volume=100, value=0x0b
01-08 19:18:03.937: I/acm_ach_elba(104): Elba_Handle: set register 0x31 [0x49 --> 0x00]
01-08 19:18:03.937: I/acm_ach_elba(104): Elba_Handle: set register 0x32 [0x04 --> 0x00]
 
hmm sieht so aus als würde der Fehler erst bei getContent() auftauchen.

Dein problem ist, dass du generell alle Exceptions abfängst.
Dadurch wird nur der Exception name ausgegeben.

Aber er schreibt die URL ja noch raus.
System.out.println (page);
das funktioniert also noch.

Änder mal dein Catch das er nur IOException abfängt.
Dann solltest du eine Fehlermeldung mit stacktrace im LogCat finden.
Das dürfte aussagekräftiger sein.
 
Würde es nicht "e.printStackTrace();" auch einfach tun?

"page.getContent();" ist auch nur eine Abkürzung für "page.openConnection().getContent();" das sollte sowieso wieder die android.os.NetworkOnMainThreadException werfen. Das ist seit Android 3.0 drin, falls deine alte Android Version also unter 3.0 war...

Wieso hier aber noch eine IndexOutOfBounds fliegt, weiß ich immer noch nicht. Klärt sich aber hoffentlich, wenn du den kompletten StackTrace uns gibst.
 
Ja, allerdings ist das generelle Abfangen von "Exception" keine gute Idee und zeigt eher, dass derjenige, der es programmiert hat nicht weiß was er da eigentlich tut.
Er folgt einfach nur seiner IDE die im sagt hier muss ein Try/catch drum.

Generell sollte man erst mal nur checked Exceptions abfangen.
Ein paar RuntimeExceptions, die meiner Meinung nach eher historisch bedingt nicht "checked" sind beispielsweise NumberFormatException die meiner Meinung nach eher nicht zu den RuntimeExceptions gehören sollte.
Denn die kann ich eher vermeiden, als eine IOException bei URL.getContent() die wiederum eher eine RunTime Exception ist und auch bei vollkommen korrekten Eingabedaten auftreten kann. Wenn z.B. der Internetzugang nicht funktioniert ist das ein Runtime Problem und keines auf das ich zwingend Einfluß nehmen kann.
 
So ich habe jetzt bei catch e.printStackTrace() reingeschrieben. Nun zeigt mir die LogCat folgendes an:





01-11 14:59:09.117: W/System.err(23065): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:156)
01-11 15:01:00.632: I/System.out(23065): http://192.168.2.5/WRITEPI?ADR1=MX0.1&VALUE1=1&FORMAT1=%d
01-11 15:01:00.640: W/System.err(23065): java.lang.IndexOutOfBoundsException
01-11 15:01:00.640: W/System.err(23065): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:156)
01-11 15:01:00.640: W/System.err(23065): at java.lang.StringBuilder.append(StringBuilder.java:311)
01-11 15:01:00.640: W/System.err(23065): at libcore.net.UriCodec.appendEncoded(UriCodec.java:114)
01-11 15:01:00.640: W/System.err(23065): at libcore.net.UriCodec.appendPartiallyEncoded(UriCodec.java:142)
01-11 15:01:00.640: W/System.err(23065): at java.net.URLStreamHandler.toExternalForm(URLStreamHandler.java:281)
01-11 15:01:00.640: W/System.err(23065): at java.net.URL.toURILenient(URL.java:510)
01-11 15:01:00.640: W/System.err(23065): at libcore.net.http.HttpEngine.<init>(HttpEngine.java:195)
01-11 15:01:00.640: W/System.err(23065): at libcore.net.http.HttpURLConnectionImpl.newHttpEngine(HttpURLConnectionImpl.java:256)
01-11 15:01:00.640: W/System.err(23065): at libcore.net.http.HttpURLConnectionImpl.initHttpEngine(HttpURLConnectionImpl.java:243)
01-11 15:01:00.640: W/System.err(23065): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:78)
01-11 15:01:00.640: W/System.err(23065): at java.net.URLConnection.getContent(URLConnection.java:190)
01-11 15:01:00.640: W/System.err(23065): at java.net.URL.getContent(URL.java:447)
01-11 15:01:00.640: W/System.err(23065): at com.example.benzkosystem_v1.MainActivity$1.onClick(MainActivity.java:26)
01-11 15:01:00.640: W/System.err(23065): at android.view.View.performClick(View.java:4274)
01-11 15:01:00.640: W/System.err(23065): at android.view.View$PerformClick.run(View.java:17357)
01-11 15:01:00.640: W/System.err(23065): at android.os.Handler.handleCallback(Handler.java:615)
01-11 15:01:00.640: W/System.err(23065): at android.os.Handler.dispatchMessage(Handler.java:92)
01-11 15:01:00.640: W/System.err(23065): at android.os.Looper.loop(Looper.java:137)
01-11 15:01:00.640: W/System.err(23065): at android.app.ActivityThread.main(ActivityThread.java:4949)
01-11 15:01:00.640: W/System.err(23065): at java.lang.reflect.Method.invokeNative(Native Method)
01-11 15:01:00.640: W/System.err(23065): at java.lang.reflect.Method.invoke(Method.java:511)
01-11 15:01:00.640: W/System.err(23065): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1043)
01-11 15:01:00.640: W/System.err(23065): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
01-11 15:01:00.640: W/System.err(23065): at dalvik.system.NativeStart.main(Native Method)
01-11 15:01:01.101: D/PowerManagerService(370): releaseWakeLockLocked : ON_AFTER_RELEASE
01-11 15:01:01.101: D/PowerManagerService(370): releaseWakeLockLocked flags=0x0 tag=KEEP_SCREEN_ON_FLAG
01-11 15:01:01.437: I/ppd(120): set_gpu_frequency : Constraint set for GPU0 (156000-624000-ondemand)
01-11 15:01:01.437: I/ppd(120): set_ddr_frequency : Constraint set for DDR (156000-533000-50-simple_ondemand)
01-11 15:01:01.437: I/ppd(120): set_cpu_frequency : Constraint set for CPU0 (312000-1205000-ondemand)
01-11 15:01:01.437: I/ppd(120): set_cpu_frequency : Constraint set for CPU0 governor threshold(0-0)
01-11 15:01:01.437: I/ppd(120): set_cpu_frequency : Constraint set for CPU0 governor sampling_rate(10000)
01-11 15:01:01.437: W/ppd(120): set_cpu_frequency : NULL cpu frequency parameters
01-11 15:01:01.437: I/ppd(120): set_cpu_hotplug_lock : Constraint set for CPU lock(0)
01-11 15:01:01.648: D/BatteryService(370): update start
01-11 15:01:01.648: D/BatteryService(370): level:89 scale:100 status:3 health:2 present:true voltage: 4011 temperature: 223 technology: Li-ion AC powered:false USB powered:true icon:17303331 invalid charger:0 online:4 charge type:0 current avg:17
01-11 15:01:01.656: D/STATUSBAR-BatteryController(463): onReceive() - ACTION_BATTERY_CHANGED
01-11 15:01:01.656: D/STATUSBAR-BatteryController(463): onReceive() - level:89
01-11 15:01:01.656: D/STATUSBAR-BatteryController(463): onReceive() - plugged:2
01-11 15:01:01.656: E/MtpService(22717): In MTPAPP onReceive:android.intent.action.BATTERY_CHANGED
01-11 15:01:01.656: E/MtpService(22717): battPlugged Type : 2
01-11 15:01:01.656: D/STATUSBAR-BatteryController(463): onReceive() - BATTERY_STATUS_DISCHARGING: tw_stat_sys_battery_usb_not_charge
01-11 15:01:01.695: D/STATUSBAR-PhoneStatusBar(463): ACTION_BATTERY_CHANGED
01-11 15:01:01.703: D/STATUSBAR-PhoneStatusBar(463): NORMAL_BATTERY
01-11 15:01:01.726: D/STATUSBAR-NetworkController(463): refreshSignalCluster: data=0 bt=false
01-11 15:01:02.062: D/STATUSBAR-NetworkController(463): onReceive() - RSSI_CHANGED_ACTION, WIFI_STATE, NETWORK_STATE
01-11 15:01:02.062: D/STATUSBAR-NetworkController(463): refreshSignalCluster: data=0 bt=false
01-11 15:01:02.101: D/BatteryStatsImpl(370): ++++++xy WakeLock stop : pid=2022, name=, type=0, tid=548, pid=370, pName=null
01-11 15:01:02.125: E/NotificationService(370): Ignoring notification with icon==0: Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x62 kind=[null])
01-11 15:01:02.125: D/STATUSBAR-NotificationService(370): Noti Alert - mSystemReady:true, AlertEnabled:true
01-11 15:01:02.132: E/SPPClientService(2022): ============PushLog. commonIsShipBuild. stop!
01-11 15:01:02.132: D/SPPClientService(2022): PushLog.txt file is not deleted.
01-11 15:01:02.132: D/SPPClientService(2022): PushLog.txt file is not deleted.
01-11 15:01:02.132: D/SPPClientService(2022): ============PushLog. stop!
01-11 15:01:02.132: E/SPPClientService(2022): [PushClientService] Push log off : This is Ship build version
01-11 15:01:02.132: E/SPPClientService(2022): [PushClientService] PushClient version : 1.2.3.3, PushClient server version : 1, PushClient platform version: 16
01-11 15:01:02.132: D/dalvikvm(370): WAIT_FOR_CONCURRENT_GC blocked 0ms
01-11 15:01:02.359: D/dalvikvm(370): GC_EXPLICIT freed 1025K, 52% free 24233K/49607K, paused 17ms+18ms, total 219ms
01-11 15:01:02.421: E/SPPClientService(2022): [PushClientService] onStartCommand. F:false, D:false, E:false, T:false, S:false, R:false
01-11 15:01:02.421: E/SPPClientService(2022): [a] Connection is already disconnected.
01-11 15:01:02.421: E/SPPClientService(2022): sendInitReq
01-11 15:01:02.429: D/BatteryStatsImpl(370): ++++++xy WakeLock start : pid=2022, name=, type=0, tid=380, pid=370, pName=null
01-11 15:01:02.429: D/BatteryStatsImpl(370): ++++++xy WakeLock stop : pid=2022, name=, type=0, tid=818, pid=370, pName=null
01-11 15:01:02.609: W/PowerManagerService(370): Timer 0x3->0x3|0x0
01-11 15:01:02.734: D/STATUSBAR-NetworkController(463): refreshSignalCluster: data=0 bt=false
01-11 15:01:02.796: I/ppd(120): void* event_wait(void*) : Got EVENT code=0x39, value=0x3034
01-11 15:01:02.796: I/ppd(120): void* event_wait(void*) : First input event, wakeup ppd

Der ursprüngliche Beitrag von 15:08 Uhr wurde um 15:16 Uhr ergänzt:

Und folgendes bei einer IOException:

01-11 15:12:03.281: I/System.out(23810): http://192.168.2.5/WRITEPI?ADR1=MX0.1&VALUE1=1&FORMAT1=%d
01-11 15:12:03.289: D/AndroidRuntime(23810): Shutting down VM
01-11 15:12:03.289: W/dalvikvm(23810): threadid=1: thread exiting with uncaught exception (group=0x4186d2a0)
01-11 15:12:03.289: E/AndroidRuntime(23810): FATAL EXCEPTION: main
01-11 15:12:03.289: E/AndroidRuntime(23810): java.lang.IndexOutOfBoundsException
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:156)
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.lang.StringBuilder.append(StringBuilder.java:311)
01-11 15:12:03.289: E/AndroidRuntime(23810): at libcore.net.UriCodec.appendEncoded(UriCodec.java:114)
01-11 15:12:03.289: E/AndroidRuntime(23810): at libcore.net.UriCodec.appendPartiallyEncoded(UriCodec.java:142)
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.net.URLStreamHandler.toExternalForm(URLStreamHandler.java:281)
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.net.URL.toURILenient(URL.java:510)
01-11 15:12:03.289: E/AndroidRuntime(23810): at libcore.net.http.HttpEngine.<init>(HttpEngine.java:195)
01-11 15:12:03.289: E/AndroidRuntime(23810): at libcore.net.http.HttpURLConnectionImpl.newHttpEngine(HttpURLConnectionImpl.java:256)
01-11 15:12:03.289: E/AndroidRuntime(23810): at libcore.net.http.HttpURLConnectionImpl.initHttpEngine(HttpURLConnectionImpl.java:243)
01-11 15:12:03.289: E/AndroidRuntime(23810): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:78)
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.net.URLConnection.getContent(URLConnection.java:190)
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.net.URL.getContent(URL.java:447)
01-11 15:12:03.289: E/AndroidRuntime(23810): at com.example.benzkosystem_v1.MainActivity$1.onClick(MainActivity.java:27)
01-11 15:12:03.289: E/AndroidRuntime(23810): at android.view.View.performClick(View.java:4274)
01-11 15:12:03.289: E/AndroidRuntime(23810): at android.view.View$PerformClick.run(View.java:17357)
01-11 15:12:03.289: E/AndroidRuntime(23810): at android.os.Handler.handleCallback(Handler.java:615)
01-11 15:12:03.289: E/AndroidRuntime(23810): at android.os.Handler.dispatchMessage(Handler.java:92)
01-11 15:12:03.289: E/AndroidRuntime(23810): at android.os.Looper.loop(Looper.java:137)
01-11 15:12:03.289: E/AndroidRuntime(23810): at android.app.ActivityThread.main(ActivityThread.java:4949)
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.lang.reflect.Method.invokeNative(Native Method)
01-11 15:12:03.289: E/AndroidRuntime(23810): at java.lang.reflect.Method.invoke(Method.java:511)
01-11 15:12:03.289: E/AndroidRuntime(23810): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1043)
01-11 15:12:03.289: E/AndroidRuntime(23810): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
01-11 15:12:03.289: E/AndroidRuntime(23810): at dalvik.system.NativeStart.main(Native Method)
 
Wenn ich das richtig sehe ist das Problem immer noch das % Zeichen in der URL, das darf da nicht rein.
Android versucht nämlich (hab mir die Android sourcen angeguckt) das zu escapen da aber nur 1 Zeichen dahinter steht funktioniert das nicht und es kommt zum IndexOutOfBoundException.
 
Danke amfa,

daran liegt es. Das Problem ist nur, dass ich dieses Zeichen für meine Anwendung dringend benötige. Gibt es hier irgend eine Lösung? Bei alten
Android-Versionen hat es kein Problem gegeben.
 
Du kannst versuchen die URL vorher zu encoden.
Statt % kannste %25 schreiben, dass ist dann encoded versuch das erst mal so.
Wenn du öfter illegale Zeichen in deinen URLs hast würde ich aber gucken das ich die vorher durch nen Encoder schicke.
 
Es klappt!! Besten dank euch allen und besonders amfa.

Schönes Wochenende noch.:biggrin:
 
Zurück
Oben Unten