2013-09-24 21 views
0

我對Java仍然很陌生,並且正在致力於一個類項目,這個項目即將讓我脫穎而出。我試圖從iTunes API中提取JSON信息。被拉的信息來自某個相冊。我在WebClass.java類的getURLStringResponse()方法中使用了try/catch,它拋出了內置的異常,我不知道爲什麼也不能從我的老師那裏得到幫助。所以我正在接觸大腦!在Java拋出異常時獲取URL響應

如果有幫助,這是我的github鏈接

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

這是我的主要活動

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(); 
     } 
    } 
} 

} 

這裏是網頁類

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; 
    } 
} 

這也是FileClass它處理一些文件響應

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; 
    } 

} 

這就是logcat中顯示了當跑

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 

回答

2

在你onCreate方法你有

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

​​

宣告但尚未初始化,即。它默認爲null。你需要初始化它並可能填充它。

ArrayAdapter構造嘗試使用此代碼

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

所以你得到一個NullPointerException創建ArrayList(不是那種java.util)。


請學會使用調試器並讀取堆棧跟蹤。

+0

謝謝,我解決了,但它仍然崩潰。 – user2789153

+0

@ user2789153由於其他原因它可能會崩潰。直到你告訴我們,我們才能知道。 –

+0

這些課程和講師並不完全是最好的。我明白了,謝謝 – user2789153