java.lang.NullPointerException 问题

标签 java android nullpointerexception android-logcat

我意识到这通常是一个简单的问题,但我一直在这个网站和其他网站上查看其他类似的问题,但无法修复代码,也无法确切地看到错误来自何处。我的问题似乎是调用分配给按钮的 OnClickListener,但我可能又错了。我基本上是直接从另一个有效的应用程序中复制了这段代码(进行了最小的更改)。这个事实让我更加困惑。预先感谢您帮助解决这个相对简单的问题。

代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.update_activity);

    final Handler handler;
    handler = new Handler();

    final EditText getCustID = (EditText) findViewById(R.id.customer);
    final EditText custvar1 = (EditText) findViewById(R.id.var1);
    final EditText custvar2 = (EditText) findViewById(R.id.var2);
    final EditText custvar3 = (EditText) findViewById(R.id.var3);

    class sendGET implements Runnable
    {
        private String url;

        public sendGET(String mUrl)
        {
            url = mUrl;
        }

        public void run()
        {
            try
            {
                //Declare HttpClient and HttpGet
                HttpClient client = new DefaultHttpClient();
                HttpGet httpget = new HttpGet(url);

                //Run HttpGet
                client.execute(httpget);

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    class getCustomerData implements Runnable
    {       
        public void run()
        {
            try
            {
                InputStream stream = null;
                XMLparser xmlParser = new XMLparser();
                List<Customer> customers = null;

                String parseUrl = URL + getCustID.getText().toString();

                try
                {
                    stream = downloadUrl(parseUrl);
                    customers = xmlParser.parse(stream);
                }
                finally
                {
                    stream.close();
                }

                final Customer data = customers.get(0);

                handler.post(new Runnable() {
                    public void run() {
                        custvar1.setText(String.valueOf(data.var1));
                        custvar2.setText(String.valueOf(data.var2));
                        custvar3.setText(String.valueOf(data.var3));
                    }
                });
            }
            catch (IOException e)
            {
                //return getResources().getString(R.string.connection_error);
            }
            catch (XmlPullParserException e)
            {
                //return getResources().getString(R.string.xml_error);
            }
        }

        private Customer readCustomer(XmlPullParser parser) throws XmlPullParserException, IOException
        {
            parser.require(XmlPullParser.START_TAG, null, "customer");
            String custID = null;
            String var1 = null;
            String var2 = null;
            String var3 = null;

            while(parser.next() != XmlPullParser.END_TAG)
            {
                if (parser.getEventType() != XmlPullParser.START_TAG)
                {
                    continue;
                }
                String name = parser.getName();
                if (name.equals("CustID"))
                {
                    custID = readCustID(parser);
                } else if (name.equals("custvar1"))
                {
                    var1 = readVar1(parser);
                } else if (name.equals("custvar2"))
                {
                    var2 = readVar2(parser);
                } else if (name.equals("custvar3"))
                {
                    var3 = readVar3(parser);
                } else
                {
                    skip(parser);
                }

            }
            return new Customer(custID, var1, var2, var3);
        }

        private String readCustID(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "CustID");
            final String custID = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "CustID");
            return custID;
        }

        private String readVar1(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "custvar1");
            String var1 = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "custvar1");
            return var1;
        }

        private String readVar2(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "custvar2");
            String var2 = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "custvar2");
            return var2;
        }

        private String readVar3(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            parser.require(XmlPullParser.START_TAG, null, "custvar3");
            String var3 = readText(parser);
            parser.require(XmlPullParser.END_TAG, null, "custvar3");
            return var3;
        }

        private String readText(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            String result = "";
            if (parser.next() == XmlPullParser.TEXT)
            {
                result = parser.getText();
                parser.nextTag();
            }
            return result;
        }

        private void skip(XmlPullParser parser) throws IOException, XmlPullParserException
        {
            if (parser.getEventType() != XmlPullParser.START_TAG)
            {
                throw new IllegalStateException();
            }
            int depth = 1;
            while (depth != 0)
            {
                switch (parser.next()) {
                case XmlPullParser.END_TAG:
                    depth --;
                case XmlPullParser.START_TAG:
                    depth++;
                    break;
                }
            }
        }

        class XMLparser
        {       
            public List<Customer> parse(InputStream in) throws XmlPullParserException, IOException {
                try
                {
                    XmlPullParser parser = Xml.newPullParser();
                    parser.setInput(in, null);
                    parser.nextTag();
                    return readXML(parser);
                } finally {
                    in.close();
                }
            }

            private List<Customer> readXML(XmlPullParser parser) throws XmlPullParserException, IOException
            {
                List<Customer> custData = new ArrayList<Customer>();

                parser.require(XmlPullParser.START_TAG, null, "xml");
                while (parser.next() != XmlPullParser.END_TAG)
                {
                    if (parser.getEventType() != XmlPullParser.START_TAG)
                    {
                        continue;
                    }
                    String name = parser.getName();

                    //Look for customer tag
                    if (name.equals("customer"))
                    {
                        custData.add(readCustomer(parser));
                    }
                    else
                    {
                        skip(parser);
                    }
                }

                return custData;
            }
        }

        private InputStream downloadUrl(String urlString) throws IOException
        {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(10000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);

            //start the query
            conn.connect();
            InputStream stream = conn.getInputStream();
            return stream;
        }
    }

    final Button getData = (Button) findViewById(R.id.getData);
    getData.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v)
        {
            //Declare and start thread
            final Runnable mGetData = new getCustomerData();
            final Thread getData = new Thread(mGetData);
            getData.start();
        }
    });

    final Button submit = (Button) findViewById(R.id.Submit);
    submit.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            //set url
            String url = "**removed**";
            url += "var1=" + custvar1.getText().toString() + "&var2=" + custvar2.getText().toString() + "&var3=" + custvar3.getText().toString();

            //Declare and start thread
            final Runnable mConnect = new sendGET(url);
            final Thread Connect = new Thread(mConnect);
            Connect.start();
        }
    });
}

public class Customer
{
    public final String custID;
    public final String var1;
    public final String var2;
    public final String var3;

    private Customer()
    {
        custID = null;
        var1 = null;
        var2 = null;
        var3 = null;
    }

    private Customer(String custID, String var1, String var2, String var3)
    {
        this.custID = custID;
        this.var1 = var1;
        this.var2 = var2;
        this.var3 = var3;

    }
}

Logcat 错误:

01-09 19:20:53.478: W/dalvikvm(911): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
01-09 19:20:53.478: E/AndroidRuntime(911): FATAL EXCEPTION: Thread-99
01-09 19:20:53.478: E/AndroidRuntime(911): java.lang.NullPointerException
01-09 19:20:53.478: E/AndroidRuntime(911):  at us.rns.editdata.UpdateActivity$1getCustomerData.run(UpdateActivity.java:90)
01-09 19:20:53.478: E/AndroidRuntime(911):  at java.lang.Thread.run(Thread.java:856)
01-09 19:20:54.408: W/IInputConnectionWrapper(911): showStatusIcon on inactive InputConnection

最佳答案

您的 downloadUrl 方法失败。

InputStream stream = null;
XMLparser xmlParser = new XMLparser();
List<Customer> customers = null;

String parseUrl = URL + getCustID.getText().toString();

try
{
    stream = downloadUrl(parseUrl);
    customers = xmlParser.parse(stream);
}
finally
{
    stream.close();
}

流对象设置为 null,然后分配 stream = downloadUrl(parseUrl)

downloadUrl 方法失败,没有向 stream 分配任何内容。

然后,您尝试在 finally 子句中关闭流。

private InputStream downloadUrl(String urlString) throws IOException
{
    URL url = new URL(urlString);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(10000);
    conn.setConnectTimeout(15000);
    conn.setRequestMethod("GET");
    conn.setDoInput(true);

    //start the query
    conn.connect();
    InputStream stream = conn.getInputStream();
    return stream;
}

在此方法上放置断点,并通过它进行调试。请返回它所中断的确切行。我怀疑它是 conn.connect();InputStream stream = conn.getInputStream();

我也会在finally子句中这样做:

finally
{
    if(stream != null)
        stream.close();
}

也可能是以下内容:

您需要移动所有这些:

final EditText getCustID = (EditText) findViewById(R.id.customer);
final EditText custvar1 = (EditText) findViewById(R.id.var1);
final EditText custvar2 = (EditText) findViewById(R.id.var2);
final EditText custvar3 = (EditText) findViewById(R.id.var3);

final Button getData = (Button) findViewById(R.id.getData);

final Button submit = (Button) findViewById(R.id.Submit);

进入onResume,而不是onCreate()

关于java.lang.NullPointerException 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14249472/

相关文章:

java - Android - 找不到 NullPointerException 的原因

java - 创建多个相似按钮/面板的正确方法

java - MAC OS系统如何安装ActiveMQ服务器?

java - GridBagLayout 上的 swing 替换组件

java - 如何实现加密的Android登录认证?

android - 加载 FirebaseUser 信息给出空值

java - Android-await 不得在 UI 线程上调用

java - Android Studio : Can't write to external storage?

java - 如何在 libgdx 中构建分屏?一个用于二维动画,一个用于信息面板

java - 为什么这个 List<> 抛出 NullPointerException?