2014-10-03 3 views
0

스왑 및 새로 고침 메서드를 추가하기 전에 제대로 실행되고있었습니다.왜이 앱을 처음 실행할 때 NullPointer 오류가 계속 발생합니까?

MainActivity.java :

package com.example.tilegame; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import android.graphics.Color; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TableRow.LayoutParams; 

public class MainActivity extends ActionBarActivity implements OnClickListener 
{ 
    TableLayout table; 
    Button buttons[]; 
    int count = 0; 
    int btnSize = (int)getResources().getDimension(R.dimen.box_size); 

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

     table = (TableLayout)findViewById(R.id.table);  
     buttons = new Button[9]; 
     for(int x = 0; x < 9; x++) 
     { 
      if(x < 8) 
      { 
       Button btn = createButton(btnSize, false, x+1); 
       buttons[x] = btn; 
      } 
      else if(x == 8) 
      { 
       Button btn = createButton(btnSize, true, x+1); 
       buttons[x] = btn; 
      } 
     } 
     randomizeArray(buttons); 
     refresh(); 
    } 

    public void onClick(View v) 
    { 
     switch(v.getId()) 
     { 
      case 0: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 

      case 1: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 

      case 2: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 

      case 3: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 

      case 4: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 

      case 5: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 

      case 6: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 

      case 7: 
       swap(buttons, v.getId()); 
       refresh(); 
       break; 
     } 
    } 

    public Button createButton(int size, boolean blank, int id) 
    { 
     Button btn = new Button(this); 

     LayoutParams buttonParams = new LayoutParams(size, size); 
     buttonParams.setMargins(5,5,5,5); 
     btn.setLayoutParams(buttonParams); 
     btn.setId(id); 
     btn.setText(""+btn.getId()); 
     btn.setOnClickListener(this); 
     if(blank == false) 
     { 
      btn.setBackgroundColor(Color.parseColor("#ffffff")); 
     } 
     else 
     { 
      btn.setVisibility(View.INVISIBLE); 
     } 
     return btn; 
    } 

    public void randomizeArray(Button[] array) 
    { 
     List<Button> list = new ArrayList<>(); 
     for(Button i : array) 
     { 
      list.add(i); 
     } 
     Collections.shuffle(list); 

     for(int x = 0; x < list.size(); x++) 
     { 
      array[x] = list.get(x); 
     } 
    } 

    public void refresh() 
    { 
     table.removeAllViews(); 
     for(int x = 0; x < 3; x++) 
     { 
      TableRow row = new TableRow(this); 
      for(int y = 0; y < 3; y++) 
      { 
       row.addView(buttons[count]); 
       count++; 
      } 
      table.addView(row, x); 
     } 
    } 

    public void swap(Button btns[], int id) 
    { 
     int posClick = 0; 
     int posBlank = 0; 
     Button temp1 = new Button(this); 
     Button temp2 = new Button(this); 

     for(int x = 0; x < btns.length; x++) 
     { 
      if(Integer.parseInt(btns[x].getText().toString()) == id) 
      { 
       posClick = x; 
      } 
     } 
     for(int x = 0; x < btns.length; x++) 
     { 
      if(Integer.parseInt(btns[x].getText().toString()) == 9) 
      { 
       posBlank = x; 
      } 
     } 
     switch(posClick) 
     { 
      case 0: 
       if(posBlank == 1 || posBlank == 3) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
      case 1: 
       if(posBlank == 0 || posBlank == 2 || posBlank == 4) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
      case 2: 
       if(posBlank == 1 || posBlank == 5) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
      case 3: 
       if(posBlank == 0 || posBlank == 4 || posBlank == 6) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
      case 4: 
       if(posBlank == 1 || posBlank == 3 || posBlank == 5 || posBlank == 7) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
      case 5: 
       if(posBlank == 2 || posBlank == 4 || posBlank == 8) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
      case 6: 
       if(posBlank == 3 || posBlank == 7) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
      case 7: 
       if(posBlank == 4 || posBlank == 6 || posBlank == 8) 
       { 
        temp1 = btns[posClick]; 
        temp2 = btns[posBlank]; 
        btns[posBlank] = temp1; 
        btns[posClick] = temp2; 
       } 
     } 
    } 

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

    @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(); 
     if (id == R.id.action_settings) 
     { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/outside" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.tilegame.MainActivity" > 

    <TableLayout 
     android:id="@+id/table" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="#38c0f4" 
     android:layout_gravity="center|top" > 

     <TableRow 
      android:id="@+id/row1"> 

      <Button 
       android:id="@+id/num_1" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:background="#FFFFFF" 
       android:layout_weight="1" 
       android:layout_margin="5dip" 
       android:text="@string/num_1"> 
      </Button> 

      <Button 
       android:id="@+id/num_2" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:background="#FFFFFF" 
       android:layout_weight="1" 
       android:layout_margin="5dip" 
       android:text="@string/num_2"> 
      </Button> 

      <Button 
       android:id="@+id/num_3" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:background="#FFFFFF" 
       android:layout_weight="1" 
       android:layout_margin="5dip" 
       android:text="@string/num_3"> 
      </Button> 
     </TableRow> 

     <TableRow 
      android:id="@+id/row2"> 

      <Button 
       android:id="@+id/num_4" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:layout_margin="5dip" 
       android:layout_weight="1" 
       android:background="#FFFFFF" 
       android:text="@string/num_4" /> 

      <Button 
       android:id="@+id/num_5" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:layout_margin="5dip" 
       android:layout_weight="1" 
       android:background="#FFFFFF" 
       android:text="@string/num_5" /> 

      <Button 
       android:id="@+id/num_6" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:layout_margin="5dip" 
       android:layout_weight="1" 
       android:background="#FFFFFF" 
       android:text="@string/num_6" /> 
     </TableRow> 

     <TableRow 
      android:id="@+id/row3"> 

      <Button 
       android:id="@+id/num_7" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:background="#FFFFFF" 
       android:layout_weight="1" 
       android:layout_margin="5dip" 
       android:text="@string/num_7"> 
      </Button> 

      <Button 
       android:id="@+id/num_8" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:background="#FFFFFF" 
       android:layout_weight="1" 
       android:layout_margin="5dip" 
       android:text="@string/num_8"> 
      </Button> 

      <Button 
       android:id="@+id/blank" 
       android:layout_width="@dimen/box_size" 
       android:layout_height="@dimen/box_size" 
       android:visibility="invisible" 
       android:layout_weight="1" 
       android:layout_margin="5dip"> 
      </Button> 
     </TableRow> 
    </TableLayout> 

</LinearLayout> 

로그인 고양이 : 도움을

10-04 02:16:25.797: E/AndroidRuntime(3418): FATAL EXCEPTION: main 
10-04 02:16:25.797: E/AndroidRuntime(3418): Process: com.example.tilegame, PID: 3418 
10-04 02:16:25.797: E/AndroidRuntime(3418): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.tilegame/com.example.tilegame.MainActivity}: java.lang.NullPointerException 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2253) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2386) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.app.ActivityThread.access$900(ActivityThread.java:169) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.os.Handler.dispatchMessage(Handler.java:102) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.os.Looper.loop(Looper.java:136) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.app.ActivityThread.main(ActivityThread.java:5476) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at java.lang.reflect.Method.invoke(Method.java:515) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at dalvik.system.NativeStart.main(Native Method) 
10-04 02:16:25.797: E/AndroidRuntime(3418): Caused by: java.lang.NullPointerException 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.content.ContextWrapper.getResources(ContextWrapper.java:94) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at com.example.tilegame.MainActivity.<init>(MainActivity.java:24) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at java.lang.Class.newInstanceImpl(Native Method) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at java.lang.Class.newInstance(Class.java:1208) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.app.Instrumentation.newActivity(Instrumentation.java:1067) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2244) 
10-04 02:16:25.797: E/AndroidRuntime(3418):  ... 11 more 

감사합니다.

또한 Java 코드를 디버깅하는 데 사용되지만 Log Cat에서 행 번호가 내 주 활동에 표시되어 null 포인터 예외가 발생합니다.

답변

1

는 :

int btnSize = (int)getResources().getDimension(R.dimen.box_size); 

대신이 작업을 수행

:

private int btnSize = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // Other codes here... 
    btnSize = (int) this.getResources().getDimension(R.dimen.box_size); 
} 
+0

내가 썼던 똑같은 ... –

+0

하지만 그것은 더 많은 낯선 사람이었습니다 :) –

4

문제는 getResourses() 방법입니다. 액티비티 클래스가 "공식적으로"인스턴스화되기 전에는 getResources()으로 전화 할 수 없습니다 (인스턴스 메서드이며 아직 인스턴스가 없습니다).

방법에서 getResourses()을 사용하십시오. 대신이의

+0

이 정확히 어떻게 구현되어 있는지? –

관련 문제