2017-10-24 9 views
0

내 코드 여기에 있습니다.null 배열 오류

package com.example.onewdivide.fortunecookiesnew; 

import android.content.Intent; import android.os.AsyncTask; import 
android.support.v7.app.AppCompatActivity; import android.os.Bundle; 
import android.util.Log; import android.view.Menu; import 
android.view.MenuInflater; import android.view.MenuItem; import 
android.view.View; import android.widget.ImageButton; import 
android.widget.ImageView; import android.widget.TextView; 

import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; 

import java.lang.reflect.Type; import java.util.Collection; 

import okhttp3.OkHttpClient; import okhttp3.Request; import 
okhttp3.Response; 

public class Process extends AppCompatActivity { 

    ImageButton MakeAWish; 
    TextView TextAtB; 
    TextView TextAtCookies; 
    TextView TextAtDate; 
    TextView TextAtResult; 
    ImageView Cookies; 
    String meanning; 
    String[] ResultFromRequest; 
    int Check; 

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

     MakeAWish = (ImageButton) findViewById(R.id.Button); 
     MakeAWish.setOnClickListener(myhandler1); 

     TextAtB = (TextView) findViewById(R.id.textatbutton); 
     TextAtCookies = (TextView)findViewById(R.id.resultatpic); 
     TextAtDate = (TextView)findViewById(R.id.date); 
     TextAtResult = (TextView)findViewById(R.id.textView7); 

     Cookies = (ImageView)findViewById(R.id.imageView); 
     Log.d("Debug this","zero"); 
     Check = 0; 

    } 

    public class JSONTask extends AsyncTask<String[], Void, CookiesResponse[]> { 

     @Override 
     protected CookiesResponse[] doInBackground(String[]... strings) { 

      try{ 
       OkHttpClient client = new OkHttpClient(); 
       Request request = new Request.Builder().url("www.atilal.info/cookies.php").build(); 

       Response response = client.newCall(request).execute(); 
       String result = response.body().string(); 

       Gson gson = new Gson(); 

       Type collectionType = new TypeToken<Collection<CookiesResponse>>() {}.getType(); 
       Collection<CookiesResponse> enums = gson.fromJson(result, collectionType); 
       CookiesResponse[] cookiesResult = enums.toArray(new CookiesResponse[enums.size()]); 

       String[] resultlast = {cookiesResult[0].getMeaning(),cookiesResult[0].getMessage()}; 
       Log.d("Debug this","two"); 
       ResultFromRequest = resultlast; 
       return cookiesResult; 

      }catch (Exception e){ 

      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(CookiesResponse[] s){ 
      super.onPostExecute(s); 


     } 

    } 

    View.OnClickListener myhandler1 = new View.OnClickListener() { 
     public void onClick(View v) { 
      Check+=1; 
      new JSONTask().execute(); 
      if(Check==1){ 
       Log.d("Debug this","one"); 

       TextAtCookies.setText(ResultFromRequest[0]); 
       TextAtResult.setText("Result : "+ ResultFromRequest[0]); 
       meanning = ResultFromRequest[1]; 
       TextAtB.setText("SAVE"); 

      } 

     } 
    }; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.mainmenu, menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_name) { 
      Intent intent = new Intent(this, MainActivity.class); 
      startActivity(intent); //   return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

버튼을 클릭하면됩니다. 그것은 치명적인 예외를 가질 것이다. 그

10-25 02:15:05.804 9777-9809/com.example.onewdivide.fortunecookiesnew E/OpenGLRenderer: allen debug liyu Key: 68724719680 
10-25 02:15:06.426 9777-9777/com.example.onewdivide.fortunecookiesnew E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.onewdivide.fortunecookiesnew, PID: 9777 
    java.lang.NullPointerException: Attempt to read from null array 
     at com.example.onewdivide.fortunecookiesnew.Process$1.onClick(Process.java:104) 
     at android.view.View.performClick(View.java:5646) 
     at android.view.View$PerformClick.run(View.java:22459) 
     at android.os.Handler.handleCallback(Handler.java:761) 
     at android.os.Handler.dispatchMessage(Handler.java:98) 
     at android.os.Looper.loop(Looper.java:156) 
     at android.app.ActivityThread.main(ActivityThread.java:6523) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 10-25 
02:15:06.435 9777-9777/com.example.onewdivide.fortunecookiesnew I/Process: Sending signal. PID: 9777 SIG: 9 
+1

귀하의 질문은 무엇입니까? 어쨌든'ResultFromRequest = resultlast;'** never ** get' 행이 나타나고 결과적으로'ResultFromRequest' _ **가 결코 인스턴스화되지 않습니다 ** _. 'ResultFromRequest'가 인스턴스화되지 않는 이유는'try' 블록에서 예외가 발생했기 때문일 수 있습니다. 그리고 당신은 당신이 현재 그 블록 안에서 어떤 예외도 무시하고 있기 때문에 그것을 알지 못합니다. –

답변

1

귀하의 AsyncTask가 비동기 적으로 실행하는 말이고, 당신은 그것을 설정하기 전에 배열을 읽기 위해 노력하고 있습니다.

이동 방법 onPostExecute에 당신에게서 OnClickListener이 코드 : 그 코드가 AsyncTask 종료 후 호출됩니다

@Override 
protected void onPostExecute(CookiesResponse[] s){ 
    if(Check==1){ 
     Log.d("Debug this","one"); 

     TextAtCookies.setText(ResultFromRequest[0]); 
     TextAtResult.setText("Result : "+ ResultFromRequest[0]); 
     meanning = ResultFromRequest[1]; 
     TextAtB.setText("SAVE"); 

    } 
} 

.

+0

그래서,이 gson (CookiesResponse)을 배열로 변환하려고 시도한 다음에 onpostExecute로 보내면됩니다. 더 좋을거야 ?? –

+0

예, 그런 식으로 클래스 변수, 좋은 솔루션이 필요하지 않습니다. –

+0

String [] resultlast = {cookiesResult [0] .getMeaning(), cookiesResult [0] .getMessage()}; 이렇게 변환하지만 여전히 nullpointerException 있습니다. 내가 잘못? –