Negative Array Size Exception

blackberry, http, java-me, post

Solution

Found it! I forgot to open the Output Stream connection

`requestOut = connection.openOutputStream();`

and I introduced `ByteArrayOutpuStream` which helped me finally display the input stream. I also, changed the way I was sending parameters, and used `URLEncodedPostData` type instead. Since the server was interpreting my former request as a GET instead of a POST. And all I have to do now is to parse the info coming in.

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.

PPS. I also used Kalai's format and it helped wonderfully.

Problem

I'm new to Blackberry and I'm trying to get post a search term to a server in xml. But I keep getting this error `Request Failed. Reason Java.lang.NegativeArraySizeException`. I wanted to check if the connection works before I parse the data so from this connection, am expecting to receive 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; } ```

Original source