Negative array exception exception

I am new to Blackberry and I am trying to post a search query to the server in xml. But I keep getting this Request Failed. Reason Java.lang.NegativeArraySizeException error Request Failed. Reason Java.lang.NegativeArraySizeException Request Failed. Reason Java.lang.NegativeArraySizeException .

I wanted to check if the connection works before parsing the data, so from this connection I expect to get the response text in xml. Below is the code:

 public void webPost(String word) { word = encode (word); String responseText; try{ HttpConnection connection = (HttpConnection)Connector.open("http://some url.xml"); connection.setRequestMethod(HttpConnection.POST); connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); String postData = "username=loginapi&password=myapilogin&term="+ word; connection.setRequestProperty("Content-Length",Integer.toString(postData.length())); connection.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0"); OutputStream requestOut = connection.openOutputStream(); requestOut.write(postData.getBytes()); InputStream detailIn = connection.openInputStream(); byte info[]=new byte[(int)connection.getLength()]; detailIn.read(info); detailIn.close(); requestOut.close(); connection.close(); responseText=new String(info); requestSuceeded(requestOut.toString(), responseText); } catch(Exception ex){ requestFailed(ex.toString()); } } private void requestSuceeded(String result, String responseText) { if(responseText.startsWith("text/xml")) { String strResult = new String(result); synchronized(UiApplication.getEventLock()) { textOutputField.setText(strResult); } } else{ synchronized(UiApplication.getEventLock()) { Dialog.alert("Unknown content type: " + responseText); } } } public void requestFailed(final String message) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { Dialog.alert("Request failed. Reason: " + message); } }); } private String encode(String textIn) { //encode text for http post textIn = textIn.replace(' ','+'); String textout = ""; for(int i=0;i< textIn.length();i++){ char wcai = textIn.charAt(i); if(!Character.isDigit(wcai) && !Character.isLowerCase(wcai) && !Character.isUpperCase(wcai) && wcai!='+'){ switch(wcai){ case '.': case '-': case '*': case '_': textout = textout+wcai; break; default: textout = textout+"%"+Integer.toHexString(wcai).toUpperCase();//=textout.concat("%").concat(Integer.toHexString(wcai)); } }else{ textout = textout+wcai;//=textout.concat(wcai+""); } } return textout; } 
+4
source share
6 answers

Found! I forgot to open a stream connection

requestOut = connection.openOutputStream();

and I introduced ByteArrayOutpuStream , which helped me finally display the input stream. I also changed the way parameters were sent and used the URLEncodedPostData type URLEncodedPostData . Since the server interpreted my previous request as GET instead of POST. And all I have to do now is to parse the information.

 try{ connection = (HttpConnection)Connector.open("http://someurl.xml",Connector.READ_WRITE); URLEncodedPostData postData = new URLEncodedPostData(URLEncodedPostData.DEFAULT_CHARSET, false); postData.append("username", "loginapi"); postData.append("password", "myapilogin"); postData.append("term", word); connection.setRequestMethod(HttpConnection.POST); connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); connection.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0"); requestOut = connection.openOutputStream(); requestOut.write(postData.getBytes()); String contentType = connection.getHeaderField("Content-type"); detailIn = connection.openInputStream(); int length = (int) connection.getLength(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); if(length > 0){ byte info[] = new byte[length]; int bytesRead = detailIn.read(info); while(bytesRead > 0) { baos.write(info, 0, bytesRead); bytesRead = detailIn.read(info); } baos.close(); connection.close(); requestSuceeded(baos.toByteArray(), contentType); detailIn.read(info); } else { System.out.println("Negative array size"); } requestOut.close(); detailIn.close(); connection.close(); } 

PS. I posted the above code to help anyone with the same problem.

SFC. I also used the Kalai format , and it helped wonderfully.

+1
source

connection.getLength () returns -1 .

Before creating an information array, check the connection length.

 int length = (int) connection.getLength(); if(length > 0){ byte info[]=new byte[length]; // perform operations }else{ System.out.println("Negative array size"); } 
+3
source

I assume that connection.getLength() returns -1 when you try to initialize your array here:

 byte info[]=new byte[(int)connection.getLength()]; 

And this is the reason for the NegativeArraySizeException exception.

+2
source

I think when you do

 byte info[]=new byte[(int)connection.getLength()]; 

An InputStream does not know its length, so it returns -1.

see http://www.velocityreviews.com/forums/t143704-inputstream-length.html

+1
source

Link: http://supportforums.blackberry.com/t5/Java-Development/HttpConnection-set-to-POST-does-not-work/mp/344946

Ref1: Blackberry sends an HTTPPost request

Ref2: http://www.blackberryforums.com/developer-forum/181071-http-post-passing-parameters-urls.html

Something like that:

 URLEncodedPostData postData = new URLEncodedPostData(URLEncodedPostData.DEFAULT_CHARSET, true); postData.append("name",name); 
+1
source

java.lang.NegativeArraySizeException indicates that you are trying to initialize an array with a negative length.

The only initializable code is

 byte info[]=new byte[(int)connection.getLength()]; 

You might want to add a length check before array initialization

0
source

All Articles