尝试读取从Http请求返回的InputStream对象时,java Scanner对象会抛出NoSuchElement异常

时间:2015-08-22 18:14:45

标签: java android

Scanner类提供了一个构造函数,它将InputStream作为参数

所以我创建了一个HttpResponse对象,并使用此类的getEntity()方法获取HttpEntity,然后在实体上调用getContent()以获取InputStream对象。所以我试图使用Scanner读取返回的InputStream对象,但它失败了。 我尝试使用HttpGet请求连接到我的Android应用程序中的数据库时遇到此问题,我有一个本地托管的php脚本,它执行一些查询到mySQL数据库并回应结果

P.S 使用下面的语句为我提供了从数据库中获取的结果,没有任何问题

BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

但我只是好奇为什么扫描仪无法工作,我想成为一名优秀的开发人员,所以每当遇到这样的问题时,我都会尝试理解问题的原因。

这是我的AsyncTask的代码片段

package com.example.helloworld;

 import android.content.Context;
 import android.os.AsyncTask;
 import android.widget.TextView;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.DefaultHttpClient;

 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.net.URI;
 import java.net.URL;
 import java.util.Scanner;

 public class SignIn extends AsyncTask<String,Void,String> {

private TextView roleField;
private Context context;
private int byGetOrPost= 0;


public SignIn(Context context,TextView roleField,int flag)
{

    this.context=context;
    this.roleField = roleField;
    byGetOrPost = flag;
}
@Override
protected String doInBackground(String... params)
{
    if(byGetOrPost == 0)
    {
        try
        {
            String username = params[0];
            String password=params[1];
            String link = "http://10.0.2.2/myandroidapp/create.php?username="+username+"&password="+password;
            URL url = new URL(link);
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(link));
            HttpResponse response = client.execute(request);
            Scanner in = new Scanner(response.getEntity().getContent());
            //BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer sb = new StringBuffer("");
            String line ="";

            while((line=in.nextLine())!=null)
            {
                sb.append(line);

            }

            in.close();
            return sb.toString();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return new String("Exception: " + e.getMessage());
        }
    }

    else

    {
        try
        {
            return  null;
        }
        catch (Exception e)
        {
            return new String("Exception: " + e.getMessage());
        }
    }
}

@Override
protected void onPostExecute(String result)
{

    this.roleField.setText(result);
}


}

当我使用Scanner对象时,抛出NoSuchElement异常。这是堆栈跟踪

08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕  java.util.NoSuchElementException
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at java.util.Scanner.nextLine(Scanner.java:1363)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at com.example.helloworld.SignIn.doInBackground(SignIn.java:54)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at com.example.helloworld.SignIn.doInBackground(SignIn.java:20)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-23 10:54:05.460    2188-2207/com.example.helloworld W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

当我摆脱扫描仪并使用BufferedReader时,它可以工作。在while循环中的当然,我改变了#34; in.nextLine()&#34; to&#34; in.readLine()&#34;当我使用BufferedReader读取内容时。它返回从数据库中提取的正确结果

BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

我的问题是为什么

BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

工作但是

Scanner in = new Scanner(response.getEntity().getContent());

不起作用?

提前致谢

1 个答案:

答案 0 :(得分:0)

BufferedReader和Scanner的工作方式不同。

BufferedReader.readLine()返回下一行,如果没有下一行,则返回null。

Scanner.nextLine()返回下一行,如果没有则抛出异常。在调用nextLine()之前,您应该通过调用hasNextLine()来检查是否有下一行。

记录在案。阅读javadoc。