【问题标题】:NullPointerException when making HTTPS call进行 HTTPS 调用时出现 NullPointerException
【发布时间】:2011-10-12 14:40:05
【问题描述】:

最近几天我一直在为这个问题摸不着头脑。我正在尝试将数据发布到安装了 SSL 证书的服务器。

我一直在结合以下代码使用 EasySSLSocketFactory 和 EasyX509TrustManager 类(http://code.google.com/p/transdroid/source/browse/trunk/src/org/xmlrpc/android/?r=103):

StringEntity se = null;
try {
    se = new StringEntity(tripArray.toString());
} catch (UnsupportedEncodingException e) { }

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));

HttpParams params = new BasicHttpParams();
params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));
params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

ClientConnectionManager cm = new SingleClientConnManager(params, schemeRegistry);
this.httpClient = new DefaultHttpClient(cm, params); 

HttpPost httpPost = new HttpPost("https://xxx");
httpPost.setEntity(se);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");

ResponseHandler responseHandler = new BasicResponseHandler();
try {
    String response = this.httpClient.execute(httpPost, responseHandler).toString();
} catch (ClientProtocolException e) {
    tripFail = true;
} catch (IOException e) {
    tripFail = true;
}

但我似乎从我的请求中得到了以下信息:

Thread [<10> Timer-1] (Suspended (exception NullPointerException))  
    Class.forName(String, boolean, ClassLoader) line: 234   
    Class.forName(String) line: 181 
    X509Certificate.<clinit>() line: 60 
    OpenSSLSocketImplWrapper(OpenSSLSocketImpl).verifyCertificateChain(byte[][], String) line: 658  
    NativeCrypto.SSL_do_handshake(int, FileDescriptor, NativeCrypto$SSLHandshakeCallbacks, int, boolean) line: not available [native method]    
    OpenSSLSocketImplWrapper(OpenSSLSocketImpl).startHandshake(boolean) line: 474   
    OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl) line: 750    
    OpenSSLSocketImplWrapper(OpenSSLSocketImpl).getInputStream() line: 692  
    SocketInputBuffer.<init>(Socket, int, HttpParams) line: 98  
    DefaultClientConnection(SocketHttpClientConnection).createSessionInputBuffer(Socket, int, HttpParams) line: 83  
    DefaultClientConnection.createSessionInputBuffer(Socket, int, HttpParams) line: 170 
    DefaultClientConnection(SocketHttpClientConnection).bind(Socket, HttpParams) line: 106  
    DefaultClientConnection.openCompleted(boolean, HttpParams) line: 129    
    DefaultClientConnectionOperator.openConnection(OperatedClientConnection, HttpHost, InetAddress, HttpContext, HttpParams) line: 171  
    SingleClientConnManager$PoolEntry(AbstractPoolEntry).open(HttpRoute, HttpContext, HttpParams) line: 164 
    SingleClientConnManager$ConnAdapter(AbstractPooledConnAdapter).open(HttpRoute, HttpContext, HttpParams) line: 119   
    DefaultRequestDirector.execute(HttpHost, HttpRequest, HttpContext) line: 359    
    DefaultHttpClient(AbstractHttpClient).execute(HttpHost, HttpRequest, HttpContext) line: 555 
    DefaultHttpClient(AbstractHttpClient).execute(HttpHost, HttpRequest, ResponseHandler, HttpContext) line: 653    
    DefaultHttpClient(AbstractHttpClient).execute(HttpUriRequest, ResponseHandler, HttpContext) line: 627   
    DefaultHttpClient(AbstractHttpClient).execute(HttpUriRequest, ResponseHandler) line: 616    
    DataSender.sendData() line: 151 
    DataSender$1.run() line: 202    
    Timer$TimerImpl.run() line: 284 

有人知道是什么原因造成的吗?这个我有点懵了。。

编辑:

我认为问题出在这里

Class.forName(String, boolean, ClassLoader) line: 234   
    Class.forName(String) line: 181 

代码似乎将一个空字符串传递给 Class.forName() 函数,导致它退出。但我不确定是什么调用它以及为什么调用它。

谢谢, 奥利

【问题讨论】:

  • https://xxx -> 你用的是真正的服务器而不是这个吗?
  • 如果您尝试修改 EasySslSocketFactory 以使用 SSLContext.getInstance("Default") 而不是 SSLContext.getInstance("TLS") 怎么办?
  • @LAS_VEGAS 哈,是的,我正在使用安装了有效 SSL 证书的服务器
  • @gabe 试过了,但被告知我不能使用默认实例。我认为问题出在这里 Class.forName(String, boolean, ClassLoader) line: 234 Class.forName(String) line: 181 代码似乎将一个空字符串传递给 Class.forName() 函数,导致它保释out.. 但我不确定是什么叫它以及为什么。
  • 可能没有找到 X509Certificate 类?

标签: java android https httpclient x509certificate


【解决方案1】:

经过长时间的讨论,解决方案是

使用 IntelliJ IDEA ;-)

【讨论】:

  • 感谢您的回答。我认为我不需要在 Android 平台上设置类似的东西,除非我错过了什么?
  • 是模拟器问题还是设备问题?
  • 似乎两者兼而有之。我还创建了一个新项目,仅使用主要活动中此线程的答案#1 中的代码:stackoverflow.com/questions/2012497/… .. 但我在模拟器和我的本机设备中都遇到了同样的问题。我一定是做错了什么,或者我的环境设置方式有问题..完全被难住了。
  • 你试过不同的android版本1.6 - 2.3吗?
  • 我曾经遇到过类加载器的问题,找不到完全可用的类。问题是我确实在代码中创建了一个新的类加载器,但它无法访问所有类。我必须将活动的类加载器传递到我创建新类加载器的位置。您是否使用第三方代码作为库?也许您可以尝试将代码移动到主应用程序的包命名空间中。
【解决方案2】:

看起来 Eclipse 给我造成了这个问题。正如 gabe 所建议的那样,Intellij idea 社区版可以很好地编译代码并且不会导致 NullPointerException。我不知道是什么原因造成的,也不知道如何解决。从现在开始,我将使用不同的 IDE。

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 2015-02-13
    • 2012-01-21
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多