空指针异常错误。试图从我的手机连接到比特币服务器

Posted

技术标签:

【中文标题】空指针异常错误。试图从我的手机连接到比特币服务器【英文标题】:nullpointerexception error. trying to connect to the bitcoin server from my phone 【发布时间】:2014-09-08 13:17:21 【问题描述】:

我对 android、java 和主要是 jsonrpc 还很陌生... 我已经被这个错误困住了一段时间,我不知道是我的编码方式导致了这个问题,还是我试图连接到错误的服务器......

如果您能提供帮助,我们将不胜感激。

这里是错误代码和重要代码:

09-08 12:36:12.141: W/System.err(30361): Network exception: failed to connect to /10.10.11.75 (port 18332): connect failed: ECONNREFUSED (Connection refused)
09-08 12:36:12.151: W/dalvikvm(30361): threadid=11: thread exiting with uncaught exception (group=0x417df2a0)
09-08 12:36:12.151: E/AndroidRuntime(30361): FATAL EXCEPTION: AsyncTask #1
09-08 12:36:12.151: E/AndroidRuntime(30361): java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at com.bitcoinapp.MainActivity.connect(MainActivity.java:219
at com.bitcoinapp.MainActivity.access$0(MainActivity.java:157)
at com.bitcoinapp.MainActivity$BitcoinConnect.doInBackground(MainActivity.java:143)
at com.bitcoinapp.MainActivity$BitcoinConnect.doInBackground(MainActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-08 12:36:12.151: E/AndroidRuntime(30361):  ... 5 more

这是我目前正在使用的 android 代码...一旦用户按下应用程序上的按钮,所有这些代码都会运行。我正在使用我的 SAMSUNG S3 MINI 而不是模拟器。

我不得不省略一些内容,所以显示行号不会有帮助,但我已经添加了我认为重要的内容...

class Connection implements OnClickListener 

    @Override
    public void onClick(View v) 
        // TODO Auto-generated method stub
        new BitcoinConnect().execute();
     


private class BitcoinConnect extends AsyncTask<String, Integer, Object[]> 

    @Override
    protected Object[] doInBackground(String... params) 
        // TODO Auto-generated method stub
        connect();
        return null;
    


public class BasicAuthenticator implements ConnectionConfigurator 

    public void configure(HttpURLConnection connection) 

        // add custom HTTP header
        connection.addRequestProperty("myusername", "mypassword");
    


private void connect()                  //(line 157)

    //This is the code for the JSONRPC2-CLIENT iteraction
    // The JSON-RPC 2.0 server URL
    URL serverURL = null;

    try 
        serverURL = new URL("http://10.10.11.75:18332");

     catch (MalformedURLException e) 
        // handle exception...
        e.printStackTrace();
    
    // Create new JSON-RPC 2.0 client session
    JSONRPC2Session mySession = new JSONRPC2Session(serverURL);

    mySession.setConnectionConfigurator(new BasicAuthenticator());

    //This is for the bitcoin BASE interaction. 
    //for the Bitcoin Payment Request
    String method = "getinfo";

    Map<String,Object> params = new HashMap<String,Object>();   
    String id = "Request001";

    JSONRPC2Request payment = new JSONRPC2Request(method, params, id);

    String jsonString = payment.toString();

    JSONRPC2Response response = null;

    Log.i("Failed0", "Failed0");

    try 
        response = mySession.send(payment);
        Log.i("response", String.valueOf(response));
        mTextView.setText((CharSequence) response);

     catch (JSONRPC2SessionException e) 

        System.err.println(e.getMessage());
         // handle exception...
        Log.i("response", String.valueOf(response));

    

    // Print response result / error

    if (response.indicatesSuccess())                  //(line 219)
        System.out.println(response.getResult());
     else 
        System.out.println(response.getError().getMessage());
    


我将 JSONRPC2.0 库用于基本代码和客户端代码。我正在尝试连接到比特币测试网服务器。那里的IP是我尝试过的众多IP之一... 我知道测试网在端口 18332 上,主网是 8332... 我尝试了本地主机 IP,但也没有用。

我不知道我是否必须使用其他代码才能让我的手机连接到比特币服务器...

请帮助我,在此先感谢

【问题讨论】:

ECONNREFUSED - 该地址没有服务器。 10.0.0.0/8 地址是本地的。你的局域网上有这个服务器吗? 堆栈跟踪明确指出异常发生在文件 MainActivity.java 的第 219 行(连接方法)。在那里你必须寻找错误。你知道如何阅读堆栈跟踪,不是吗? 【参考方案1】:

让我们应用一些逻辑思维。

根据堆栈跟踪,NullPointerException 被抛出在这里:

   if (response.indicatesSuccess()) 

这意味着responsenull。 (别无选择!)

这意味着send 调用

   response = mySession.send(payment);

要么将分配的 null 返回到 response,要么通过您捕获的 JSONRPC2SessionException 返回。

我怀疑是后者,并且消息"Network exception: failed to connect to /10.10.11.75 (port 18332): ..." 已记录在进程中。然而,证据并不令人信服。 (logcat 输出中没有任何“I/...”行...)


总而言之,你所做的就是捕获告诉你send失败的异常,然后继续尝试处理不存在的响应!

根本问题是您的应用无法连接到端口18332 上的10.10.11.75。我假设您知道10.10.11.75 是private IP address,因此只有当服务器在您的本地网络上时您才能连接到它。

【讨论】:

+1 一步一步的解释,它向初学者展示了如何自己调查这些错误,这样他们就不会在每次抛出 NPE 时都来 SO。

以上是关于空指针异常错误。试图从我的手机连接到比特币服务器的主要内容,如果未能解决你的问题,请参考以下文章

空指针异常错误作为方法参数

Android 应用程序不断因空指针异常而崩溃

来自 Webview 的 Java 空指针异常

Redmi手机上的应用程序崩溃-ZygoteInit$Method空指针异常[重复]

规避空指针异常

Gottox socket.io-java-client“握手时出错”空指针异常