2014-10-09 4 views
0

Java 응용 프로그램에서 파일 읽기와 관련된 문제가 있습니다. 4 일 동안 CS 교사가 안드로이드 앱이 아니기 때문에 저를 도와주세요. 또한 읽은 자습서 중 하나라도 도움이되지 않습니다.getAssets를 통해 파일이 누락되었습니다.

는 나는 다음과 같은 응용 프로그램이 있습니다

그것은 내가 이전에 기록 된 Java 응용 프로그램에서 가져
 package com.bachosz.billionaires; 

import android.support.v7.app.ActionBarActivity; 
import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.util.StringTokenizer; 
import android.content.ContextWrapper; 
import android.content.res.AssetFileDescriptor; 
import android.content.res.AssetManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 


    public class MainActivityBillionaires extends ActionBarActivity { 

     private int currentQuestion; 
     private String [] answers; 
     private Button answerButton; 
     private Button questionButton; 
     private TextView questionView; 
     private TextView answerView; 
     private EditText answerText; 
     private Question [] questions; 
     private Button buttonA; 
     private Button buttonB; 
     private Button buttonC; 
     private Button buttonD; 



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

     try { 
      init(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
     } 

     public void init() throws IOException 
     { 
      questions = new Question[2]; 
      currentQuestion = 0; 
      InputStream inputStream = getResources().openRawResource(R.raw.questionstable); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
      String line = null; 
       String content,a,b,c,d,correct; 
       int id, x = 0; 
       StringTokenizer st = null; 
      while ((line=reader.readLine()) != null) 
      { 
       st= new StringTokenizer(line, ","); 
        id = Integer.parseInt(st.nextToken()); 
        content = st.nextToken(); 
        a = st.nextToken(); 
        b = st.nextToken(); 
        c = st.nextToken(); 
        d = st.nextToken(); 
        correct = st.nextToken(); 

        questions[x] = new Question(id, content, a, b, c, d, correct); 
        x++; 
      } 
      reader.close(); 


     answerButton = (Button)findViewById(R.id.AnswerButton); 
     questionButton = (Button)findViewById(R.id.QuestionButton); 
     questionView = (TextView)findViewById(R.id.QuestionTextView); 
     answerView = (TextView) findViewById(R.id.AnswerTextView); 
     answerText = (EditText) findViewById(R.id.AnswerText); 
     buttonA = (Button)findViewById(R.id.buttonA); 
     buttonB = (Button)findViewById(R.id.buttonB); 
     buttonC = (Button)findViewById(R.id.buttonC); 
     buttonD = (Button)findViewById(R.id.buttonD); 



     answerButton.setOnClickListener(new OnClickListener() 
     { 
     public void onClick(View v) { 
     checkAnswer(); 
     }}); 



     questionButton.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
     showQuestion(); 
     }}); 
     } 

     public void showQuestion() 
     { 

     // if(currentQuestion == questions.length) 
     // currentQuestion =0;  

     questionView.setText(questions[0].toString()); 
     answerView.setText(""); 
     answerText.setText(""); 
     currentQuestion++; 

     } 

     public boolean isCorrect(String answer) 
     { 
     return (answer.equalsIgnoreCase(questions[currentQuestion].getCorrect())); 
     } 

     public void checkRight() 
     { 
     // String right 
     } 
     public void checkAnswer() 
     { 
     String answer = questions[currentQuestion].getCorrect(); 
     if(isCorrect(answer)) 
     answerView.setText("You're right!"); 
     else 
     answerView.setText("Sorry, the correct answer is "+answers[currentQuestion]); 

     } 


    @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_activity_billionaires, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

(즉, 왜 그렇게 많은 의견입니다). Android 앱에서 fileName에 어떻게 액세스 할 수 있습니까? 나는 InputStream을 시도하고 Assets 등을 얻는다.하지만 작동하지 않거나 부적절하게 수행하고있다. 현재 그것은 NullPointerException을 던지고있다.

LOG의 CAT :

10-09 13:38:37.663: E/Trace(921): error opening trace file: No such file or directory (2) 
10-09 13:38:39.354: D/AndroidRuntime(921): Shutting down VM 
10-09 13:38:39.354: W/dalvikvm(921): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
10-09 13:38:39.384: E/AndroidRuntime(921): FATAL EXCEPTION: main 
10-09 13:38:39.384: E/AndroidRuntime(921): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bachosz.billionaires/com.bachosz.billionaires.MainActivityBillionaires}: java.lang.NullPointerException 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.os.Looper.loop(Looper.java:137) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-09 13:38:39.384: E/AndroidRuntime(921): at java.lang.reflect.Method.invokeNative(Native Method) 
10-09 13:38:39.384: E/AndroidRuntime(921): at java.lang.reflect.Method.invoke(Method.java:511) 
10-09 13:38:39.384: E/AndroidRuntime(921): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-09 13:38:39.384: E/AndroidRuntime(921): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-09 13:38:39.384: E/AndroidRuntime(921): at dalvik.system.NativeStart.main(Native Method) 
10-09 13:38:39.384: E/AndroidRuntime(921): Caused by: java.lang.NullPointerException 
10-09 13:38:39.384: E/AndroidRuntime(921): at com.bachosz.billionaires.MainActivityBillionaires.readFile(MainActivityBillionaires.java:111) 
10-09 13:38:39.384: E/AndroidRuntime(921): at com.bachosz.billionaires.MainActivityBillionaires.init(MainActivityBillionaires.java:140) 
10-09 13:38:39.384: E/AndroidRuntime(921): at com.bachosz.billionaires.MainActivityBillionaires.onCreate(MainActivityBillionaires.java:70) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.Activity.performCreate(Activity.java:5008) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
10-09 13:38:39.384: E/AndroidRuntime(921): ... 11 more 
+0

logcat에서 예외 전체를 게시 할 수 있습니까? – Subbu

+0

완료 : 도움이되기를 바랍니다. – user3795517

+0

라인 111은 무엇입니까? – ToYonos

답변

0

오류는 com.bachosz.billionaires.MainActivityBillionaires에서 NPE (Null 포인터 예외)를 얻고 말한다. 해당 활동을 호출하는 데 사용하는 코드 섹션을 살펴 봐야합니다. (위의 코드에 없습니다. 그렇지 않으면 주어진 정보가있는 행을 알 수 없습니다)

또 다른 확실한 점은 적절한 컨텍스트가 있다는 것입니다.

AssetManager assetManage = appContext.getAssets(); 
String[] filelist = assetManage.list(""); 
+0

응답 해 주셔서 감사합니다. 그러나 MainActivity를 호출하지 않고 응용 프로그램을 시작합니다. 전체 MainActivity를 보여주기 위해 코드를 업데이트했습니다. appContext를 추가 한 후에도 여전히 오류가 발생합니다. – user3795517

0

먼저 코드를 정리해야합니다. 여기에 우리가 무엇을하고 있는지 모르는 곳에서 코드를 정리해야합니다.
이해하기 쉽습니다.

왜 자산을 사용하고 있습니까? Android에서 리소스에 액세스하는 가장 일반적인 방법은 .../res/raw 폴더입니다.
자동 생성 된 R.class에서 파일을 참조하므로 어디서나 액세스 할 수 있습니다.
파일 이름이 소문자이고 공백이 없는지 확인하십시오. 원시 폴더가없는 경우 수동으로 만듭니다. 첫째

InputStream inputStream = getResources().openRawResource(R.raw.YOURFILE); 
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
String line = reader.readLine(); 
while (line != null) 
{ 
    // Read file. 
} 
+0

답변 해 주셔서 감사합니다. 나는 그것을 사용했지만 여전히 데이터에 액세스 할 때 null null이 발생합니다. 코드를 업데이트했습니다. 네가 그것을 찾으면 나는 고맙게 여길 것이다. – user3795517

+0

내가 pendrive에서 실행하는 이유가 무엇일까? – user3795517

+0

당신을 진심으로 환영합니다. NullPointerException을 얻는 ** exact ** statment는 무엇입니까? 그리고 당신이 pendrive에서 달리고 있다는 것은 무엇을 의미합니까 ?? :) – Alberto

0

을 :

이 시도 자산 폴더에 YOURFILE를 복사합니다.

다음

, 그리고 AssetManager assetManage = getAssets();

,

InputStream myInput = null; 
    try { 
     myInput = assetManager.open("YOURFILE"); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

그리고 마지막으로 BufferedReader reader = new BufferedReader(new InputStreamReader(myInput));

단계로 위의 코드 단계를 따릅니다.

관련 문제