显示java.lang.NullPointerException:尝试获取空数组长度 [英] java.lang.NullPointerException: Attempt to get length of null array

查看:561
本文介绍了显示java.lang.NullPointerException:尝试获取空数组长度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图获取有关电影数据库的电影资料。然后用我的布局,我想它显示我的设备上一个gridview。这是我通过使用ArrayAdapter做。我只是想diplay网格中的电影的名字。
但我不断收到显示java.lang.NullPointerException:尝试在空对象引用调用虚拟方法java.lang.String中java.lang.Object.toString()'的错误。
我的code是如下:

 公共类MainActivityFragment扩展片段{
    ArrayAdapter<串GT; mMovieAdapter;    公共MainActivityFragment(){
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
        mMovieAdapter =新ArrayAdapter<串GT;(getActivity(),R.layout.item_movies,R.id.image_view_movie,新的ArrayList<串GT;());
        查看rootView = inflater.inflate(R.layout.fragment_main,集装箱,FALSE);
        GridView控件的ListView =(GridView控件)rootView.findViewById(R.id.gridview_movies);
        listView.setAdapter(mMovieAdapter);
        listView.setOnItemClickListener(新AdapterView.OnItemClickListener(){
            @覆盖
            公共无效onItemClick(适配器视图<>适配器视图,视图观点,INT I,长L){
                意向意图=新意图(getActivity(),DetailActivity.class);
                串预测= mMovieAdapter.getItem(ⅰ);
                intent.putExtra(Intent.EXTRA_TEXT,预测);
                startActivity(意向);
                / *
                 *上下文的背景下= getActivity();串预测=
                 * mForecastAdapter.getItem(ⅰ); INT持续时间=
                 * Toast.LENGTH_SHORT; Toast.makeText(背景下,预测,
                 *持续时间).show();
                 * /
            }
        });
        返回rootView;
    }    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(真);
    }    @覆盖
    公共无效onCreateOptionsMenu(菜单菜单,MenuInflater气筒){
        //充气菜单;如果是present这增加了项目操作栏。
        inflater.inflate(R.menu.movi​​efragment,菜单);
    }    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        INT ID = item.getItemId();
        如果(ID == R.id.action_refresh){
            updateMovie();
            返回true;
        }
        返回super.onOptionsItemSelected(项目);
    }    //到活动开始时更新天气
    @覆盖
    公共无效调用onStart(){
        super.onStart();
        updateMovie();
    }    私人无效updateMovie(){
        FetchMovieTask movieTask =新FetchMovieTask();
        movieTask.execute();
    }    类FetchMovieTask扩展的AsyncTask<无效,无效的String []> {
        私人最终字符串LOG_TAG = FetchMovieTask.class.getSimpleName();        @覆盖
        受保护的String [] doInBackground(虚空...... PARAMS){
            / *如果(params.length == 0){返回null; } * /
            //这两个需要的try / catch之外声明
            //使他们能够在关闭最后块。
            HttpURLConnection类的URLConnection = NULL;
            读者的BufferedReader = NULL;            //将包含原始JSON响应作为一个字符串。
            字符串movieJsonStr = NULL;            尝试{
                //构造的URL OpenWeatherMap查询
                //可能的参数是在OWM的预测API页面缴费,
                // 在
                // http://openweathermap.org/API#forecast
                最后弦乐BASE_URL =htt​​p://api.themoviedb.org/3/discover/movie?
                最后弦乐QUERY_PARAM =sort_by;
                最后弦乐KEY_PARAM =&放大器; API_KEY
                //使用UriBuilder
                乌里builtUri = Uri.parse(BASE_URL).buildUpon()appendQueryParameter(QUERY_PARAMpopularity.desc)appendQueryParameter(KEY_PARAMc20129fdf73b5df3ab44548ad7f73586),建立()。;
                网址URL =新的URL(builtUri.toString());
                //打印日志中的网址
                // Log.v(LOG_TAG,内置URI+ builtUri.toString());                //创建请求OpenWeatherMap,并打开连接
                URLConnection的=(HttpURLConnection类)url.openConnection();
                urlConnection.setRequestMethod(GET);
                urlConnection.connect();                //读取输入流中的String
                为InputStream的InputStream = urlConnection.getInputStream();
                StringBuffer的缓冲区=新的StringBuffer();
                如果(InputStream的== NULL){
                    // 没事做。
                    返回null;
                }
                读者=新的BufferedReader(新的InputStreamReader(InputStream的));                串线;
                而((行= reader.readLine())!= NULL){
                    //因为它是JSON,增加一个新行是没有必要的(它
                    //不会影响解析)
                    //但它确实使调试* *很多更容易,如果你的打印
                    //出完成
                    //缓冲区进行调试。
                    buffer.append(行+\\ n);
                }                如果(buffer.length()== 0){
                    //流是空的。在分析没有意义的。
                    返回null;
                }
                movieJsonStr = buffer.toString();            }赶上(IOException异常五){
                Log.e(LOG_TAG,错误,E);
                //如果code没有成功获得气象数据,有
                //在attemping没有意义
                //解析它。
                返回null;
            } {最后
                如果(URLConnection的!= NULL){
                    urlConnection.disconnect();
                }
                如果(读者!= NULL){
                    尝试{
                        reader.close();
                    }赶上(最终IOException异常五){
                        Log.e(LOG_TAG,错误收盘流,E);
                    }
                }
            }
            尝试{
                返回getMovieDataFromJson(movieJsonStr);
            }赶上(JSONException j)条{
                Log.e(LOG_TAG,JSON错误,J);
            }
            返回null;
        }        私有String [] getMovieDataFromJson(字符串forecastJsonStr)抛出JSONException {
            字符串称号;
            JSONObject的movieJson =新的JSONObject(forecastJsonStr);
            JSONArray movieArray = movieJson.getJSONArray(结果);            的String [] = resultStrs新的String [100];
            的for(int i = 0; I< movieArray.length();我++){
                //获取JSON对象重新presenting一天
                的JSONObject电影= movieArray.getJSONObject(ⅰ);                标题= movie.getString(ORIGINAL_TITLE);
                resultStrs [I] =称号;
                Log.v(LOG_TAG,resultStrs [I]);
            }            / *
             *对于(一个String:resultStrs){Log.v(LOG_TAG,预测条目:+
             * S); }
             * /
            返回resultStrs;
        }        @覆盖
        保护无效onPostExecute(字符串[]字符串){
            super.onPostExecute(字符串);
            mMovieAdapter.clear();
            mMovieAdapter.addAll(字符串);
        }
    }
}

和我的错误日志是:

 显示java.lang.NullPointerException:尝试对空对象引用调用虚拟方法java.lang.String中java.lang.Object.toString()
        在android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
        在android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
        在android.widget.AbsListView.obtainView(AbsListView.java:2344)
        在android.widget.GridView.makeAndAddView(GridView.java:1433)
        在android.widget.GridView.makeRow(GridView.java:361)
        在android.widget.GridView.fillDown(GridView.java:302)
        在android.widget.GridView.fillGap(GridView.java:262)
        在android.widget.AbsListView.trackMotionScroll(AbsListView.java:4968)
        在android.widget.AbsListView $ FlingRunnable.run(AbsListView.java:4512)
        在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767)
        在android.view.Choreographer.doCallbacks(Choreographer.java:580)
        在android.view.Choreographer.doFrame(Choreographer.java:549)
        在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:753)
        在android.os.Handler.handleCallback(Handler.java:739)
        在android.os.Handler.dispatchMessage(Handler.java:95)
        在android.os.Looper.loop(Looper.java:135)
        在android.app.ActivityThread.main(ActivityThread.java:5312)
        在java.lang.reflect.Method.invoke(本机方法)
        在java.lang.reflect.Method.invoke(Method.java:372)
        在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:901)


解决方案

我怀疑这是也是由黑带在评论中提到的错误

的String [] = resultStrs新的String [100];

这应该是

的String [] = resultStrs新的String [movieArray.length();

由于你现在要做的是说,到GridView你的总是 100部电影,但是当有不到100部电影你到GridView给予null元素

I am trying to get data about movies from the movie database. Then using a gridview in my layout I want to display it on my device. This I do by using an ArrayAdapter. I just want to diplay the names of the movies in a grid. But I keep getting "java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference" error. My code is as follows:

public class MainActivityFragment extends Fragment {
    ArrayAdapter<String> mMovieAdapter;

    public MainActivityFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mMovieAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_movies, R.id.image_view_movie, new ArrayList<String>());
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        GridView listView = (GridView) rootView.findViewById(R.id.gridview_movies);
        listView.setAdapter(mMovieAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(getActivity(), DetailActivity.class);
                String forecast = mMovieAdapter.getItem(i);
                intent.putExtra(Intent.EXTRA_TEXT, forecast);
                startActivity(intent);
                /*
                 * Context context = getActivity(); String forecast =
                 * mForecastAdapter.getItem(i); int duration =
                 * Toast.LENGTH_SHORT; Toast.makeText(context, forecast,
                 * duration).show();
                 */
            }
        });
        return rootView;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.
        inflater.inflate(R.menu.moviefragment, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_refresh) {
            updateMovie();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    // TO update weather when activity starts
    @Override
    public void onStart() {
        super.onStart();
        updateMovie();
    }

    private void updateMovie() {
        FetchMovieTask movieTask = new FetchMovieTask();
        movieTask.execute();
    }

    class FetchMovieTask extends AsyncTask<Void, Void, String[]> {
        private final String LOG_TAG = FetchMovieTask.class.getSimpleName();

        @Override
        protected String[] doInBackground(Void... params) {
            /* if(params.length == 0) { return null; } */
            // These two need to be declared outside the try/catch
            // so that they can be closed in the finally block.
            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;

            // Will contain the raw JSON response as a string.
            String movieJsonStr = null;

            try {
                // Construct the URL for the OpenWeatherMap query
                // Possible parameters are avaiable at OWM's forecast API page,
                // at
                // http://openweathermap.org/API#forecast
                final String BASE_URL = "http://api.themoviedb.org/3/discover/movie?";
                final String QUERY_PARAM = "sort_by";
                final String KEY_PARAM = "&api_key";
                // Using UriBuilder
                Uri builtUri = Uri.parse(BASE_URL).buildUpon().appendQueryParameter(QUERY_PARAM, "popularity.desc").appendQueryParameter(KEY_PARAM, "c20129fdf73b5df3ab44548ad7f73586").build();
                URL url = new URL(builtUri.toString());
                // Printing the url in the log
                // Log.v(LOG_TAG, "Built URI " + builtUri.toString());

                // Create the request to OpenWeatherMap, and open the connection
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                // Read the input stream into a String
                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();
                if (inputStream == null) {
                    // Nothing to do.
                    return null;
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    // Since it's JSON, adding a newline isn't necessary (it
                    // won't affect parsing)
                    // But it does make debugging a *lot* easier if you print
                    // out the completed
                    // buffer for debugging.
                    buffer.append(line + "\n");
                }

                if (buffer.length() == 0) {
                    // Stream was empty. No point in parsing.
                    return null;
                }
                movieJsonStr = buffer.toString();

            } catch (IOException e) {
                Log.e(LOG_TAG, "Error ", e);
                // If the code didn't successfully get the weather data, there's
                // no point in attemping
                // to parse it.
                return null;
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (final IOException e) {
                        Log.e(LOG_TAG, "Error closing stream", e);
                    }
                }
            }
            try {
                return getMovieDataFromJson(movieJsonStr);
            } catch (JSONException j) {
                Log.e(LOG_TAG, "JSON Error", j);
            }
            return null;
        }

        private String[] getMovieDataFromJson(String forecastJsonStr) throws JSONException {
            String title;
            JSONObject movieJson = new JSONObject(forecastJsonStr);
            JSONArray movieArray = movieJson.getJSONArray("results");

            String[] resultStrs = new String[100];
            for (int i = 0; i < movieArray.length(); i++) {
                // Get the JSON object representing the day
                JSONObject movie = movieArray.getJSONObject(i);

                title = movie.getString("original_title");
                resultStrs[i] = title;
                Log.v(LOG_TAG, resultStrs[i]);
            }

            /*
             * for (String s : resultStrs) { Log.v(LOG_TAG, "Forecast entry: " +
             * s); }
             */
            return resultStrs;
        }

        @Override
        protected void onPostExecute(String[] strings) {
            super.onPostExecute(strings);
            mMovieAdapter.clear();
            mMovieAdapter.addAll(strings);
        }
    }
}

And my error log is:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
        at android.widget.AbsListView.obtainView(AbsListView.java:2344)
        at android.widget.GridView.makeAndAddView(GridView.java:1433)
        at android.widget.GridView.makeRow(GridView.java:361)
        at android.widget.GridView.fillDown(GridView.java:302)
        at android.widget.GridView.fillGap(GridView.java:262)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4968)
        at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4512)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
        at android.view.Choreographer.doCallbacks(Choreographer.java:580)
        at android.view.Choreographer.doFrame(Choreographer.java:549)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5312)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)

解决方案

I suspect this is the error as also mentioned by Blackbelt in the comments

String[] resultStrs = new String[100];

This should be

String[] resultStrs = new String[movieArray.length()];

Because what you now do is say to the GridView you have always 100 movies but when there are less than 100 movies you are giving null elements to the GridView

这篇关于显示java.lang.NullPointerException:尝试获取空数组长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆