2017년 1월 15일 일요일

Exception in thread "main" java.lang.RuntimeException: Stub! 발생이유

HttpClient 를 사용중 아래 와 같은 오류가 발생할때 대처법

Exception in thread "main" java.lang.RuntimeException: Stub!
at org.apache.http.impl.client.AbstractHttpClient.<init>(AbstractHttpClient.java:5)
at org.apache.http.impl.client.DefaultHttpClient.<init>(DefaultHttpClient.java:7)
at com.xxx.xxx.xxx.xxx.execute(xxx.java:76)
at com.xxx.xxx.xxx.xxx.main(xxx.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

코드는 아래와 같이 사용하였습니다.
발생 원인은 android studio에서 httpclient를 사용하였었는데요. 그리고는 android 단말에서 실행 시킨게 아니라 java main에 연결하여 java native형태로 실행시켜서 발생한 문제입니다. 아무래도 httpclient android용이 android없이 동작할때 제대로 동작이 안되도록 되어있어서 이러한 현상이 발생하였습니다.
해결책은 test code를 android가 정상적으로 돌 수있는 환경을 만들어서 앱 내에서 테스트 할수있도록 변경하였습니다.

샘플코드
public class GetHttpWithAHttpClient {
...

    public boolean execute(String addr) {
        boolean retval = true;
        errorCode = ERROR_CODE_NOERROR;

        //CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpClient httpclient = new DefaultHttpClient();
        try {
            HttpGet httpGet = new HttpGet(addr);
            HttpResponse response1 = httpclient.execute(httpGet);

            try {
                System.out.println(response1.getStatusLine());
                HttpEntity entity1 = response1.getEntity();
                // do something useful with the response body 
               // and ensure it is fully consumed
                entity1.getContent().read(htmlByte);
            } finally {
                //response1.close();            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
            errorCode = ERROR_CODE_HTTP_EXCEPTION;
            retval = false;
        } catch (IOException e) {
            e.printStackTrace();
            errorCode = ERROR_CODE_HTTP_EXCEPTION;
            retval = false;
        } finally {
            //try {
                //httpclient.close();
            //} catch (IOException e) {
            //    e.printStackTrace();
            //}
        }
        return retval;
    }

    public final static void main(String[] args) throws Exception {
        System.out.println("test");
        GetHttpWithAHttpClient http = new GetHttpWithAHttpClient();
        http.execute("http://www.daum.net");
    }
}











댓글 없음:

댓글 쓰기