user2789153
user2789153

Reputation: 1

getting URL response in Java throwing exception

I am still new to Java and working on a class project that is about to make me pull my hair out. I am trying to pull JSON info from iTunes API. The information being pulled is from a certain album. I am using a try/catch in my getURLStringResponse() method in the WebClass.java class and it is throwing the built in exception and I have NO idea why and can't get help from my teacher at all. So I am reaching out to the brains!

If it helps, here is my github link

https://github.com/agvinsant/Java1/tree/master/week3

Here is my Main Activity

package com.agvinsant.java1application;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.agvinsant.lib.BasicLayout;
import com.agvinsant.lib.WebClass;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

Context context;
String[] songName;
Resources res;
TextView results;
Spinner viewSpinner;
TextView jsonView;
TextView connectedView;
String trackName;
String artistName;
String albumName;
String trackSite;

ArrayList<String> trackNameList = new ArrayList<String>();
ArrayList<String> artistNameList = new ArrayList<String>();
ArrayList<String> albumNameList = new ArrayList<String>();
ArrayList<String> trackSiteList = new ArrayList<String>();

Boolean connected = false;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    context = this;
    res = getResources();

    // setting the linear layout
    LinearLayout ll = new LinearLayout(this);
    LinearLayout ml = BasicLayout.layoutWithButton(this, "Show Info");
    ll.setOrientation(LinearLayout.VERTICAL);
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
    ll.setLayoutParams(lp);

    // Creating button from BasicLayout class
    Button mb = (Button) ml.findViewById(1);
    mb.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // Get selected song info
            int pos = viewSpinner.getSelectedItemPosition();
            String tName = trackNameList.get(pos).toString();
            String arName = artistNameList.get(pos).toString();
            String alName = albumNameList.get(pos).toString();  
            String tSite = trackSiteList.get(pos).toString();

            jsonView.setText("Song Name: " +tName+ "\r\n" + "Artist Name: " +arName+ "\r\n" +"Album Name: "+alName+ "\r\n" + "Song Website: " +tSite);
        }

    });



    connectedView = new TextView(context);

    //Detecting network settings
            connected = WebClass.getConnectionStatus(context);
            if(connected){
                Log.i("Network Connection", WebClass.getConnectionType(context));
                connectedView.setText("Network Connection: " + WebClass.getConnectionType(context)+"\n");
            }
            else{
                    connectedView.setText(""+WebClass.getConnectionType(context)+"\n");
            }


    // calling the getSongInfo function 
    getSongInfo();

    // song length display
    int songNum = res.getStringArray(R.array.songArray).length;
    TextView tv = new TextView(context);
    tv.setText("Check out one of the "+songNum+" songs on the album");

    //spinner adapter
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, songName);
    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    //creating the spinner
    viewSpinner = new Spinner(context);
    viewSpinner.setAdapter(spinnerAdapter);
    lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    viewSpinner.setLayoutParams(lp);

    //spinner onClick function
    viewSpinner.setOnItemSelectedListener(new OnItemSelectedListener(){

        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id) {
            Toast.makeText(context, "You selected " + songName[position], Toast.LENGTH_LONG).show();
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }

    });


    // setting different layout parts to the main layout
    ll.addView(ml);
    ll.addView(tv);
    ll.addView(viewSpinner);
    //ll.addView(connectedView);
    ll.addView(jsonView);


    // setting the content view
    setContentView(ll);




}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

//get URL
private void getSongInfo(){
    String baseURL = "https://itunes.apple.com/search?term=groove+logic+logical+thinking";
    URL finalURL;
    try{
        finalURL = new URL(baseURL);
        songRequest sr = new songRequest();
        sr.execute(finalURL);
    } catch (MalformedURLException e){
        Log.e("BAD URL", "MALFORMED URL");
        finalURL = null;
    }
}

//get data from URL
private class songRequest extends AsyncTask<URL, Void, String>{
    @Override
    protected String doInBackground(URL... urls){
        String response = "";
        for(URL url: urls){
            response = WebClass.getURLStringResponse(url);
        }
        return response;
    }

    //get data and add to arrays.
    @Override
    protected void onPostExecute(String result){
        try {

            Log.i("URL Response", result);
            JSONArray jsonArray = new JSONArray(result);

            int n = jsonArray.length();
            for(int i = 0;i<n; i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);

                trackName = jsonObject.getString("trackName");
                artistName= jsonObject.getString("artistName");
                albumName = jsonObject.getString("collectionName");
                trackSite= jsonObject.getString("trackViewUrl");
                trackNameList.add(trackName);
                artistNameList.add(artistName);
                albumNameList.add(albumName);  
                trackSiteList.add(trackSite);
            }

        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }   
}

}

Here is the WebClass

package com.agvinsant.lib;

import java.io.BufferedInputStream;
import java.net.URL;
import java.net.URLConnection;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;

public class WebClass {

    static Boolean connection = false;
    static String connectionType = "Unavailable";

    public static String getConnectionType(Context context){

        webInfo(context);
        return connectionType;
    }

    public static Boolean getConnectionStatus(Context context){

        webInfo(context);
        return connection;
    }

    private static void webInfo(Context context){


        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if(ni != null){

            if(ni.isConnected()){
                connectionType = ni.getTypeName();
                connection = true;

            }
        }
    }

    public static String getURLStringResponse(URL url){
        String response = "";

        try{

            URLConnection conn = url.openConnection();
            BufferedInputStream bin = new BufferedInputStream(conn.getInputStream());

            byte[] contentBytes = new byte[1024];
            int bytesRead = 0;
            StringBuffer responseBuffer = new StringBuffer();

            while((bytesRead = bin.read(contentBytes)) != -1){

                response = new String(contentBytes,0,bytesRead);
                responseBuffer.append(response);
            }
            return responseBuffer.toString();
        }
        catch(Exception e){
            // This is the exception that is being thrown
            Log.e("URL RESPONSE ERROR", "getURLStringResponse");
        }

        return response;
    }
}

This is also a FileClass that handles some of the file response

package com.agvinsant.lib;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.content.Context;
import android.util.Log;

// TODO: Auto-generated Javadoc
/**
 * The Class FileClass.
 */
public class FileClass {

    /**
     * Store string file.
     *
     * @param context the context
     * @param filename the filename
     * @param content the content
     * @param external the external
     * @return the boolean
     */
    @SuppressWarnings("resource")
    public static Boolean storeStringFile(Context context, String filename, String content, Boolean external){
        try{
            File file;
            FileOutputStream fos;
            if(external){
                file = new File(context.getExternalFilesDir(null), filename);
                fos = new FileOutputStream(file);
            }else{
                fos = context.openFileOutput(filename, Context.MODE_PRIVATE);
            }
            fos.write(content.getBytes());
            fos.close();
        } catch (IOException e){
            Log.e("WRITE ERROR", filename);
        }
        return true;
    }


    /**
     * Store object file.
     *
     * @param context the context
     * @param filename the filename
     * @param external the external
     * @return the boolean
     */
    public static Boolean storeObjectFile(Context context, String filename, Boolean external){

        return true;
    }


    /**
     * Store object file.
     *
     * @param context the context
     * @param filename the filename
     * @param content the content
     * @param external the external
     * @return the boolean
     */
    @SuppressWarnings("resource")
    public static Boolean storeObjectFile(Context context, String filename, Object content, Boolean external){
        try{
            File file;
            FileOutputStream fos;
            ObjectOutputStream oos;
            if(external){
                file = new File(context.getExternalFilesDir(null), filename);
                fos = new FileOutputStream(file);
            } else {
                fos = context.openFileOutput(filename, Context.MODE_PRIVATE);
            }
            oos = new ObjectOutputStream(fos);
            oos.writeObject(content);
            oos.close();
            fos.close();
        } catch (IOException e){
            Log.e("WRITE ERROR", filename);
        }
        return true;
    }


    /**
     * Read string file.
     *
     * @param context the context
     * @param filename the filename
     * @param external the external
     * @return the string
     */
    @SuppressWarnings("resource")
    public static String readStringFile(Context context, String filename, Boolean external){
        String content = "";
        try{
            File file;
            FileInputStream fin;
            if(external){
                file = new File(context.getExternalFilesDir(null), filename);
                fin = new FileInputStream(file);
            } else {
                file = new File(filename);
                fin = context.openFileInput(filename);
            }
            BufferedInputStream bin = new BufferedInputStream(fin);
            byte[] contentBytes = new byte[1024];
            int bytesRead = 0;
            StringBuffer contentBuffer = new StringBuffer();

            while((bytesRead = bin.read(contentBytes)) != -1){
                content = new String(contentBytes,0,bytesRead);
                contentBuffer.append(content);
            }
            content = contentBuffer.toString();
            fin.close();
        } catch (FileNotFoundException e) {
            Log.e("READ ERROR", "FILE NOT FOUND " + filename);
        } catch (IOException e){
            Log.e("READ ERROR", "I/O ERROR");
        }
        return content;
    }


    /**
     * Read object file.
     *
     * @param context the context
     * @param filename the filename
     * @param external the external
     * @return the object
     */
    @SuppressWarnings("resource")
    public static Object readObjectFile(Context context, String filename, Boolean external){
        Object content = new Object();
        try{
            File file;
            FileInputStream fin;
            if(external){
                file = new File(context.getExternalFilesDir(null), filename);
                fin = new FileInputStream(file);
            } else {
                file = new File(filename);
                fin = context.openFileInput(filename);
            }

            ObjectInputStream ois = new ObjectInputStream(fin);
            try{
                content = (Object) ois.readObject();
            } catch (ClassNotFoundException e){
                Log.e("READ ERROR", "INVALID JAVA OBJECT FILE");
            }
            ois.close();
            fin.close();
        } catch (FileNotFoundException e) {
            Log.e("READ ERROR", "FILE NOT FOUND " + filename);
            return null;
        } catch (IOException e){
            Log.e("READ ERROR", "I/O ERROR");
        }
        return content;
    }

}

This is what the LogCat shows when ran

09-11 21:11:25.496: E/Trace(2500): error opening trace file: No such file or directory (2)
09-11 21:11:25.676: I/Network Connection(2500): mobile
09-11 21:11:25.707: D/AndroidRuntime(2500): Shutting down VM
09-11 21:11:25.707: W/dalvikvm(2500): threadid=1: thread exiting with uncaught exception (group=0xb2f55288)
09-11 21:11:25.756: E/AndroidRuntime(2500): FATAL EXCEPTION: main
09-11 21:11:25.756: E/AndroidRuntime(2500): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.agvinsant.java1application/com.agvinsant.java1application.MainActivity}: java.lang.NullPointerException
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.os.Looper.loop(Looper.java:137)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.ActivityThread.main(ActivityThread.java:4745)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at java.lang.reflect.Method.invokeNative(Native Method)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at java.lang.reflect.Method.invoke(Method.java:511)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at dalvik.system.NativeStart.main(Native Method)
09-11 21:11:25.756: E/AndroidRuntime(2500): Caused by: java.lang.NullPointerException
09-11 21:11:25.756: E/AndroidRuntime(2500):     at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at java.util.Arrays.asList(Arrays.java:154)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at com.agvinsant.java1application.MainActivity.onCreate(MainActivity.java:121)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.Activity.performCreate(Activity.java:5008)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
09-11 21:11:25.756: E/AndroidRuntime(2500):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
09-11 21:11:25.756: E/AndroidRuntime(2500):     ... 11 more
09-11 21:11:25.766: E/URL RESPONSE ERROR(2500): getURLStringResponse

Upvotes: 0

Views: 829

Answers (1)

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 279960

In your onCreate method you have

ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, songName);

but

String[] songName;

is declared but not initialized, ie. it's null by default. You need to initialize it and possibly populate it.

The ArrayAdapter constructor tries to create an ArrayList (not the java.util kind) with this code

   ArrayList(E[] array) {
        if (array==null)
            throw new NullPointerException();
        a = array;
    }

so you get a NullPointerException.


Please learn to use a debugger and to read stack traces.

Upvotes: 2

Related Questions