Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我应该得到a时返回null<;字符串>**编辑**_Java_String_Android Studio_Null_Return - Fatal编程技术网

Java 当我应该得到a时返回null<;字符串>**编辑**

Java 当我应该得到a时返回null<;字符串>**编辑**,java,string,android-studio,null,return,Java,String,Android Studio,Null,Return,已编辑忘记包含实际问题 所以我知道我的文件返回null,因为我的“GetData()”调用正在通过我的纸条的其余部分,导致了一个错误。然而,我不知道如何防止这种情况。有人能给我指出正确的方向吗 问题 我得到的错误是 尝试对空对象引用调用虚拟方法“java.lang.Object[]java.util.ArrayList.toArray()” 根据我的理解,当我使用这条线时 titles=readRss.titles; 它通过以下顺序提取空响应。ReadRss>ProcessXml()>G

已编辑忘记包含实际问题

所以我知道我的文件返回null,因为我的“GetData()”调用正在通过我的纸条的其余部分,导致了一个错误。然而,我不知道如何防止这种情况。有人能给我指出正确的方向吗

问题 我得到的错误是

尝试对空对象引用调用虚拟方法“java.lang.Object[]java.util.ArrayList.toArray()”

根据我的理解,当我使用这条线时

titles=readRss.titles;
它通过以下顺序提取空响应。ReadRss>ProcessXml()>Getdata() 由于get数据是一个“try”“catch”部分,因此它同时返回xmldoc和null

当我在ProcessXml()中登录时,我可以获得完整的标题列表,并且可以单独记录提要项,但是如果我尝试在该列表之外登录,它将返回null

我误解了什么

ReadRss脚本:

public class ReadRss extends AsyncTask<Void, Void, Void> {
ArrayList<String>titles;


BlankFragment context;
String address="https://www.sciencemag.org/rss/news_current.xml";
//ProgressDialog progressDialog;
ArrayList<FeedItem> feedItems;
RecyclerView recyclerView;
URL url;
public ReadRss(BlankFragment context, RecyclerView recyclerView){
    this.recyclerView=recyclerView;
    this.context=context;
   // progressDialog = new ProgressDialog(context);
   // progressDialog.setMessage("Loading...");
}

@Override
protected void onPreExecute() {
    //progressDialog.show();
    super.onPreExecute();
}



@Override
public void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    //progressDialog.dismiss();


}

@Override
public Void doInBackground(Void... voids) {
    ProcessXml(Getdata());
    return null;
}


public ArrayList<String> ProcessXml(Document data) {

    if (data!=null) {
        titles=new ArrayList<>();
        feedItems=new ArrayList<>();
        Element root=data.getDocumentElement();
        Node channel=root.getChildNodes().item(1);
        NodeList items=channel.getChildNodes();
        for (int i=0;i<items.getLength();i++){
            Node currentchild=items.item(i);
            if (currentchild.getNodeName().equalsIgnoreCase("item")){
                FeedItem item=new FeedItem();
                NodeList itemchilds=currentchild.getChildNodes();
                for (int j=0;j<itemchilds.getLength();j++){
                    Node current=itemchilds.item(j);
                    if (current.getNodeName().equalsIgnoreCase("title")){
                        item.setTitle(current.getTextContent());
                        titles.add(current.getTextContent());
                    }else if (current.getNodeName().equalsIgnoreCase("description")){
                        item.setDescription(current.getTextContent());
                    }else if (current.getNodeName().equalsIgnoreCase("pubDate")){
                        item.setPubDate(current.getTextContent());
                    }else if (current.getNodeName().equalsIgnoreCase("link")){
                        item.setLink(current.getTextContent());
                    }else if (current.getNodeName().equalsIgnoreCase("media:thumbnail")){
                        String url=current.getAttributes().item(0).getTextContent();
                        item.setThumbnailUrl(url);
                    }

                }
                feedItems.add(item);
                Log.d("hello", item.getTitle());


            }

        }
    }

    return titles;


}

public Document Getdata(){
    try{

        url = new URL(address);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        InputStream inputStream = connection.getInputStream();
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document xmlDoc = builder.parse(inputStream);
        return xmlDoc;
    } catch (Exception e){
        e.printStackTrace();

    }


    return null;
}




}
公共类ReadRss扩展异步任务{
ArrayListtitles;
空白片段语境;
字符串地址=”https://www.sciencemag.org/rss/news_current.xml";
//进行对话进行对话;
ArrayList饲料项目;
回收视图回收视图;
网址;
public ReadRss(BlankFragment上下文,RecyclerView-RecyclerView){
this.recyclerView=recyclerView;
this.context=context;
//progressDialog=新建progressDialog(上下文);
//progressDialog.setMessage(“加载…”);
}
@凌驾
受保护的void onPreExecute(){
//progressDialog.show();
super.onPreExecute();
}
@凌驾
公共作废onPostExecute(作废避免){
super.onPostExecute(避免);
//progressDialog.disclose();
}
@凌驾
公共作废doInBackground(作废…作废){
ProcessXml(Getdata());
返回null;
}
公共ArrayList ProcessXml(文档数据){
如果(数据!=null){
titles=新的ArrayList();
feedItems=新的ArrayList();
元素根=data.getDocumentElement();
节点通道=root.getChildNodes()。项(1);
NodeList items=channel.getChildNodes();

对于(int i=0;i这是一种竞赛条件,尽管听起来似乎只有一条路径总是赢得比赛。 您正在使用2个线程

  • 线程1(可能是UI线程)-创建ReadRss-读取“标题”
  • 后台线程-执行GetData()-执行ProcessXml()-设置“标题”
  • 如果主线程在后台线程开始实例化“titles”之前读到了“titles”,那么“titles”将为空


    也许在创建AsyncTask之后,您可以继续创建视图-显示“加载”标题的位置.

    我下面的答案对你有帮助吗?你可以通过记录“标题”的实例化时间和使用时间来测试它-这会让你知道先发生什么对不起,假期让我离开了。我刚刚回到这个项目。谢谢,它确实帮了我很多。这帮助我意识到我做错了什么,但是我不知道如何修复它.至少这样我对需要做的事情有了更好的理解。
    public class BlankFragment extends Fragment {
    ArrayList<FeedItem>feedItems;
    ArrayList<String>titles;
    
    String address="https://www.sciencemag.org/rss/news_current.xml";
    URL url;
    
    
    
    public BlankFragment() {
        // Required empty public constructor
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    }
    
    @TargetApi(Build.VERSION_CODES.N)
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_blank, container, false);
    
        RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.rv_recycler_view);
        rv.setHasFixedSize(true);
    
        ReadRss readRss = new ReadRss(this, rv);
        readRss.getClass();
    
    
    
    
        titles = readRss.titles;
    
    
    
        String[] display_titles = (String[]) titles.toArray();
    
    
    
    
    
    
    
    
    
    
    
        //Document data = readRss.Getdata();
        //ArrayList<FeedItem> feedItems = readRss.ProcessXml(data);
    
    
    
        MyAdapter adapter = new MyAdapter(display_titles);
        rv.setAdapter(adapter);
    
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(llm);
    
        return rootView;
    }
    
    
    
    
    }