java - 尝试使用 HttpURLConnection 从 url 读取信息时出现 NullPointerException

标签 java android nullpointerexception inputstream httpurlconnection

我正在尝试使用 HttpURLConnection 从 url 中读取一些信息,但是,当我尝试运行它时,我得到:

java.lang.RuntimeException: Unable to start activity ComponentInfo{...}: java.lang.NullPointerException: println needs a message.

我见过很多这样做的例子,那么问题是什么?我已经仔细检查了 url,当我将它复制/粘贴到网络浏览器时,我收到了我应该收到的消息,没问题。我使用相同的 url 将信息获取到不同的程序(用 C++ 编写)并且在那里工作得很好。是否有我错过的连接设置或其他什么?

这是代码,问题出现在“InputStream stream = connection.getInputStream();”:

public String download_organisations(String url){
    String jsonString = "";
    try {
        if(!url.startsWith("http://")){
            url = "http://" + url;
        }
        if(url.endsWith("/")){
            url = url.substring(0, url.lastIndexOf("/"));
        }
        url = url + SystemStatic.URL_SERVICE_WEB_ORGANISATION_MANAGER;

        Log.d("OrganisationManager-Android","url: " + url);
        URL httpUrl = new URL(url);

        HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
        connection.setConnectTimeout(10000);


        InputStream stream = connection.getInputStream();

        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[1024];
        while ((nRead = stream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }

        buffer.flush();
        byte[] inputStreamByteArray = buffer.toByteArray();

        byte[] base64 = Base64.decode(inputStreamByteArray, 0);
        byte[] decrypted = CipherUtils.decrypt(base64);

        jsonString = decrypted.toString();

        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            Log.d("OrganisationManager-Android", "Download succeded with response: " + connection.getResponseCode());
        } else {
            Log.d("OrganisationManager-Android", "Download failed with response: " + connection.getResponseCode());
        }
    } catch (MalformedURLException e) {
        Log.e("OrganisationManager-Android", e.getMessage());

    } catch (IOException e) {
        Log.e("OrganisationManager-Android", e.getMessage());

    } catch (Exception e) {
        Log.e("OrganisationManager-Android", e.getMessage());

    }

    return jsonString;
}

错误栈:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.organisationmanager.cin, PID: 2066
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.organisationmanager.cin/com.organisationmanager.ble.ScanningActivity}: java.lang.NullPointerException: println needs a message
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
                  at android.app.ActivityThread.-wrap12(Unknown Source:0)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
                  at android.os.Handler.dispatchMessage(Handler.java:108)
                  at android.os.Looper.loop(Looper.java:166)
                  at android.app.ActivityThread.main(ActivityThread.java:7425)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
               Caused by: java.lang.NullPointerException: println needs a message
                  at android.util.Log.println_native(Native Method)
                  at android.util.Log.e(Log.java:261)
                  at com.organisationmanager.ble.common.OrganisationManagerWebPortalCommunicationHelper.download_organisations(OrganisationManagerWebPortalCommunicationHelper.java:210)
                  at com.organisationmanager.ble.ScanningActivity.onCreate(ScanningActivity.java:184)
                  at android.app.Activity.performCreate(Activity.java:7372)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302) 
                  at android.app.ActivityThread.-wrap12(Unknown Source:0) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891) 
                  at android.os.Handler.dispatchMessage(Handler.java:108) 
                  at android.os.Looper.loop(Looper.java:166) 
                  at android.app.ActivityThread.main(ActivityThread.java:7425) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) 

最佳答案

错误堆栈显示:

Caused by: java.lang.NullPointerException: println needs a message at android.util.Log.println_native(Native Method) at android.util.Log.e(Log.java:261)

从这些行可以看出,Log.e() 引发了异常在其中一个 catch里面的方 block download_organisations() (捕获 MalformedURLException 的那个,或者捕获 IOException 的那个,或者捕获 Exception 的那个)。

您在 catch 中处理异常通过记录他们的消息来阻止。但也许他们的信息是null , 所以 println没有要打印的有效消息并抛出 NullPointerException .

尝试记录 e相反,并检查是否再次抛出“java.lang.NullPointerException: println needs a message”。这样做:

} catch (IOException e) {
        Log.e("OrganisationManager-Android", e.toString());
}

否则你可以打印捕获异常的堆栈跟踪:

} catch (IOException e) {
        Log.e("OrganisationManager-Android");
        e.printStackTrace()
}

关于java - 尝试使用 HttpURLConnection 从 url 读取信息时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51825230/

相关文章:

android - 正则表达式模式去除一些无效的 JSON 元素

java - 如何制作 Activity 来显示从服务获取的数据?

Java GUI 未打开...在后台运行...其他答案不起作用

java - 使用 ConcurrentHashMap 避免空指针异常

java - 为什么我的 Spring @Autowired 字段为空?

java - 数据库中不存在外部集合字段

java - 需要有关 Spring Boot API 微服务错误处理的建议或更好的设计

具有共享元素的 Android fragment 转换

java - 检测 JSplitPane 分隔符何时被拖动,而不是组件被调整大小

java - 使用 HttpURLConnection 使用 JSON 数据发出 PUT 请求不起作用