2013-05-08 219 views
0

我正在構建一個Android應用程序來測試主題上的人,後端是用Java編寫的,它讀取並解析CSV文件(硬編碼的URL) ,前端是我的Android應用程序。java.lang.RuntimeException:無法啓動活動ComponentInfo java.lang.NullPointerException

這是我的錯誤:

05-08 01:19:00.792: E/AndroidRuntime(790): java.lang.RuntimeException: Unable to start activity ComponentInfo{cs314.adamnick.p4/cs314.adamnick.p4.QuizTakerGUI}: java.lang.NullPointerException 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.os.Looper.loop(Looper.java:123) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-08 01:19:00.792: E/AndroidRuntime(790): at java.lang.reflect.Method.invokeNative(Native Method) 
05-08 01:19:00.792: E/AndroidRuntime(790): at java.lang.reflect.Method.invoke(Method.java:521) 
05-08 01:19:00.792: E/AndroidRuntime(790): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-08 01:19:00.792: E/AndroidRuntime(790): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-08 01:19:00.792: E/AndroidRuntime(790): at dalvik.system.NativeStart.main(Native Method) 
05-08 01:19:00.792: E/AndroidRuntime(790): Caused by: java.lang.NullPointerException 
05-08 01:19:00.792: E/AndroidRuntime(790): at wharehouse.QuizAndroidGUI.<init>(QuizAndroidGUI.java:36) 
05-08 01:19:00.792: E/AndroidRuntime(790): at cs314.adamnick.p4.QuizTakerGUI.onCreate(QuizTakerGUI.java:38) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
05-08 01:19:00.792: E/AndroidRuntime(790): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
05-08 01:19:00.792: E/AndroidRuntime(790): ... 11 more 

這會導致我的程序崩潰。

這裏是我的類:

public class QuizTakerGUI extends Activity { 

    private RadioButton answer1; 
    private RadioButton answer2; 
    private RadioButton answer3; 
    private RadioButton answer4; 

    private Button submit; 
    private Button previous; 
    private Button next; 
    private Button finish; 

    private TextView questionArea; 

    private QuizAndroidGUI dataWharehouse; 
    private QuizQuestion currentQuestion; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_quiz_taker); 

     dataWharehouse = new QuizAndroidGUI(this); 

     answer1 = (RadioButton) findViewById(R.id.answer1); 
     answer2 = (RadioButton) findViewById(R.id.answer2); 
     answer3 = (RadioButton) findViewById(R.id.answer3); 
     answer4 = (RadioButton) findViewById(R.id.answer4); 

     questionArea = (TextView) findViewById(R.id.quizQuestion); 


     submit = (Button) findViewById(R.id.submitAnswer); 
     previous = (Button) findViewById(R.id.prev); 
     next = (Button) findViewById(R.id.next); 
     finish = (Button) findViewById(R.id.finish); 

     submit.setOnClickListener(submitHandler); 
     previous.setOnClickListener(previousHandler); 
     next.setOnClickListener(nextHandler); 
     finish.setOnClickListener(finishHandler); 
    } 

這裏是我的家datawhare類:

public QuizAndroidGUI(QuizTakerGUI app){ 
    URL path = ClassLoader.getSystemResource("questions.csv"); 
    this.androidApplication = app; 
    NUMBERofQUIZES = 10; 
    // since we implement quiz ui we pass in the current program 
    quizTaker = new QuizTaker(this); 
    try { 
     // passing in the csv file hard coded 
     parser = new QuestionParser(new File(path.toURI())); 
    } catch (FileNotFoundException e) { 
     parser = null; 
     e.printStackTrace(); 
    } catch (URISyntaxException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    quizTaker.startAndDisplayQuiz("Android Quiz", this.NUMBERofQUIZES, this.parser); 
} 

我認爲這個問題可能造成的,因爲解析器是越來越設置爲null。

+0

您在清單中獲得了<使用權限android:name =「android.permission.WRITE_EXTERNAL_STORAGE」/>「? – Bigflow 2013-05-08 07:28:48

+0

請突出顯示QuizAndroidGUI.java:36行。 – Egor 2013-05-08 07:29:13

+0

ClassLoader.getSystemResource?目的是什麼? – Blackbelt 2013-05-08 07:29:32

回答

1

questions.csv文件到你的classpath並做到這一點:

ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
URL resource = loader.getResource("myfile"); 

正確加載該文件。

+0

如何放入我的課程路徑? – 2013-05-08 07:37:21

+0

你有幾種方法可以做到這一點。你在使用eclipse嗎? – 2013-05-08 07:38:54

+0

是的,我正在使用eclipse。 – 2013-05-08 07:41:35

0

沒有足夠的線路信息,但我懷疑ClassLoader.getSystemResource("questions.csv")是不是你真正想要的東西,至少在我的經驗中看到它是非常不尋常的。

我會將該文件放在assets目錄中並使用AssetManager來讀取該文件。

+0

有沒有辦法在不是android應用程序的文件中使用資產管理器?我有一個非Java的應用程序,它是用Java編寫的,必須帶一個文件參數才能返回給我測驗問題。 – 2013-05-08 07:45:16

+0

不幸的是,你創建了一個閱讀界面,並根據你所在的平臺決定使用哪個實現。 – Zharf 2013-05-08 07:55:25