【问题标题】:http post :NullPointerException [closed]http帖子:NullPointerException [关闭]
【发布时间】:2013-01-23 23:57:35
【问题描述】:

我是 Java 新手,应该将 XML 文件发送到 HTTP 服务器。 XML文件应先转换为字符串:

我从服务器收到错误:

[stdout] (http--127.0.0.1-8080-1) failed in postjava.lang.NullPointerException

[stdout] (http--127.0.0.1-8080-1) received post request :

似乎我没有向服务器发送任何内容。

这里是代码

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;


public class try_post {

    public static void main(String[] args) {

        try{
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));


            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document doc = builder.parse("D:\\n.xml");
            StringWriter stringWriter = new StringWriter(); 

            Transformer transformer =TransformerFactory.newInstance().newTransformer(); 

            transformer.transform(new DOMSource(doc), new StreamResult(stringWriter)); 
            String strFileContent = stringWriter.toString();  
            System.out.println(strFileContent);
            System.out.println( strFileContent.getClass().getName());
            System.out.println("xml file converted to string"); 

            String param="param1=" + URLEncoder.encode(strFileContent ,"UTF-8");

            URL url = new URL("http://localhost:8080/");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setDoOutput(true);
            //      connection.setInstanceFollowRedirects(false);
            connection.setRequestMethod("POST");

            connection.setFixedLengthStreamingMode(param.getBytes().length);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());

            writer.write(param);
            writer.flush();

            String line;
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            writer.close();
            reader.close();

            String response= "";


            StreamSource source = new StreamSource(fileReader);
            StreamResult result = new StreamResult(os);
            transformer.transform(source, result);*/



            DataOutputStream fos = new DataOutputStream(connection.getOutputStream ());

            System.out.println("Response code: " + connection.getResponseCode());
            connection.disconnect();}
        catch (MalformedURLException ex) {
            System.out.print("MalformedURLException");

        } catch (Exception ex) {
            System.out.print(" Exception: "+ex.getMessage());

        }

    }

}

【问题讨论】:

    标签: java http http-post httpurlconnection


    【解决方案1】:

    没有人可以根据您发布的内容提供帮助。堆栈跟踪必须有更多。

    你的代码有很多问题:

    1. 打印堆栈跟踪,而不仅仅是消息。它将提供更多信息。
    2. 您使用连接对象而不首先检查它是否为空。可能就是这样。
    3. 与该 Document 对象相同。您如何知道 XML 已被读取?

    看起来您正在尝试从文件中读取 XML 并将其发布到在您的 localhost 上侦听的 servlet。您只需检查响应代码。我错过了什么?

    按照我的口味,你的防御力还不够。难怪你有问题。

    打印堆栈跟踪,如下所示:

        catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    

    另一个值得尝试的聪明做法是在 IntelliJ 等 IDE 中运行,并使用调试器单步调试您的代码。你会明白为什么你得到 NPE 的时间比你在这里等待答案的时间短。

    【讨论】:

    • 我问这个问题是为了弄清楚我做错了什么......我不明白你的帖子!堆栈跟踪是什么意思?我从服务器得到的唯一反馈是 [stdout] (http--127.0.0.1-8080-1) failed in postjava.lang.NullPointerException [stdout] (http--127.0.0.1-8080-1) 收到的帖子请求
    • 我是说你应该得到更多,我告诉你怎么做。打印 - 堆栈 - 跟踪。
    • 在服务器端(命令行),我只收到此错误:[stdout] (http--127.0.0.1-8080-1) failed in postjava.lang.NullPointerException [stdout] ( http--127.0.0.1-8080-1) 收到post请求
    • @lujain - 所以... 更改代码以便打印堆栈跟踪,而不是 打印异常消息。换句话说,您应该调用ex.printStackTrace(),而不是打印ex.getMessage()。然后您会看到一个又大又长的堆栈跟踪,它会告诉您引发 NullPointerException 的 EXACT 行代码。这就是调试 NullPointerException 的方式(至少这是一种方法……使用调试器会更好)。
    • 我没有得到任何异常:输出是xml文件的内容和java.lang.String xml文件转换为字符串响应代码:204
    【解决方案2】:

    哦,我明白了。只需使用 Ruby。

    require "net/http"; require "uri"
    params = { param1: File.read("D:\\n.xml") }
    uri = URI.parse("http://localhost:8080/")
    resp = Net::HTTP.post_form(uri, params)
    puts "Response code: #{resp.code}"
    

    对不起,我不得不这样做。 * 反对票的大括号 *

    【讨论】:

      【解决方案3】:

      异常发生在服务器端,而不是在您的代码中。异常堆栈跟踪是否记录在服务器上?您可能需要查看服务器端代码来调试它。

      【讨论】:

        【解决方案4】:

        据我所知,你做事很艰难。尝试使用 HTTPClient 库。 这应该会大大简化您的代码。

        有关 maven 依赖项,请参阅: http://search.maven.org/#artifactdetails%7Ccommons-httpclient%7Ccommons-httpclient%7C3.1%7Cjar

        有关工作代码示例,请参见: 见:http://www.kodejava.org/browse/47.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-06
          • 1970-01-01
          • 2015-12-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-28
          相关资源
          最近更新 更多