마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Unfortunately, Exam has stopped. 라고 뜨는데 이유를 모르겠습니다..

0 추천

안녕하세요 저는 9개의 이미지뷰와 9개의 버튼을 이용하여 그림 맞추는 게임을 만들고 있습니다

배운게 많이 없는 상황에서 만들어야 해서 정말 기초적인 지식으로 어찌저찌 만들었는데요..

가상머신을 띄우면 자꾸 멈추는 상황이 발생합니다ㅠㅠ

Logcat에서 빨간 줄이 많이 뜨는거 보면 잘못한게 많은거 같은데 못찾겠습니다

06-13 07:22:09.551 5906-5906/com.example.ekgus.finalexam01 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ekgus.finalexam01, PID: 5906
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ekgus.finalexam01/com.example.ekgus.finalexam01.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
        at android.app.ActivityThread.access$800(ActivityThread.java:151)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageResource(int)' on a null object reference
        at com.example.ekgus.finalexam01.MainActivity.initGame(MainActivity.java:52)
        at com.example.ekgus.finalexam01.MainActivity.onCreate(MainActivity.java:47)
        at android.app.Activity.performCreate(Activity.java:5990)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
        at android.app.ActivityThread.access$800(ActivityThread.java:151) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5254) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

이 부분이 모두 빨간줄로 되어 있습니다.

package com.example.ekgus.finalexam01;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

    Random rnd = new Random();

    int [] imgRes = { R.drawable.android_1, R.drawable.android_2, R.drawable.android_3, R.drawable.android_4, R.drawable.android_5, R.drawable.android_6, R.drawable.android_7, R.drawable.android_8, R.drawable.android_9 };
    ImageView[] imgView = new ImageView[9];

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        findViewById(R.id.fab).setOnClickListener(onButtonClick);
        findViewById(R.id.button1).setOnClickListener(onButtonClick);
        findViewById(R.id.button2).setOnClickListener(onButtonClick);
        findViewById(R.id.button3).setOnClickListener(onButtonClick);
        findViewById(R.id.button4).setOnClickListener(onButtonClick);
        findViewById(R.id.button5).setOnClickListener(onButtonClick);
        findViewById(R.id.button6).setOnClickListener(onButtonClick);
        findViewById(R.id.button7).setOnClickListener(onButtonClick);
        findViewById(R.id.button8).setOnClickListener(onButtonClick);
        findViewById(R.id.button9).setOnClickListener(onButtonClick);

        for (int i = 0; i < 9; i++) {
            imgView[i] = (ImageView) findViewById(R.id.imageView1 + i );
        }

        initGame(); //게임 초기화
    }

    private void initGame() {
        for (int i = 0; i < 9 ; i++) {
            imgView[i].setImageResource(R.drawable.question);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 1, 0, "다시 시작");
        menu.add(0, 2, 1, "프로그램 종료");
        menu.add(0, 3, 2, "About");

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch ( item.getItemId() ) {
            case 1:
                initGame();
                break;
            case 2:
                finishAffinity();
                break;
            case 3:
                View v = findViewById(R.id.imageView1);
                Snackbar.make(v, "이미지 맞추기", Snackbar.LENGTH_LONG).setAction("OK", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        finish();
                    }
                }).show();
        }

        return true;
    }

    Button.OnClickListener onButtonClick = new Button.OnClickListener() {
        @Override
        public void onClick(View v) {
            for (int i = 0; i < 8; i++) {
                if (v.getId() == R.id.button1 + i) {
                    int n = rnd.nextInt(7);

                    imgView[i].setImageResource(imgRes[n + 1]);

                    if (n == i) {
                        Toast.makeText(getApplicationContext(), "다음칸을 맞추세요.", Toast.LENGTH_SHORT).show();
                    }
                }
            }
            if (v.getId() == R.id.button9) {
                int n = rnd.nextInt(8);

                imgView[8].setImageResource(imgRes[n + 1]);

                if (n == 8) {
                    Toast.makeText(getApplicationContext(), "그림을 모두 맞추었습니다.", Toast.LENGTH_SHORT).show();
                }
            }
        }
    };
}

도와주시면 정말 감사하겠습니다..ㅠㅠㅠㅠ

익명사용자 님이 2018년 6월 13일 질문

1개의 답변

0 추천
imgView[i] = (ImageView) findViewById(R.id.imageView1 + i );

이부분이 문제인걸로 보입니다.

findViewById()를 했지만 실제로 xml에 정의된 ImageView를 찾지 못했으니까요

아이디는 R.id.imageView1 + i 로 글자상으로는 맞아보이지만 실제 id는 다릅니다.

for(int i = 1; i < 10; i++) {

String imageID = "imageView" + (i+1);

    int resID = getResources().getIdentifier(imageID, "id", getPackageName());
    imgView[i] = findViewById(resID));

}

가 될수있겠네요

 

참고링크 (https://stackoverflow.com/questions/4865244/android-using-findviewbyid-with-a-string-in-a-loop)
익명사용자 님이 2018년 6월 13일 답변
아무리 해봐도 안되네요..
imgView[i] = findViewById(resID));
이 부분에서 자꾸 오류가 뜬다고 합니다ㅠㅠ
참고해주신 링크 들어가서 확인해보고 이것저것 건드려도 안되네요..

imgView[i] = ((ImageView) findViewById(resID));

이렇게 바꿔서 해보았구요

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=9; index=9
        at com.example.ekgus.finalexam01.MainActivity.onCreate(MainActivity.java:48)

이렇게 오류가 뜹니다ㅠㅠ 어떻게 해야 하나요..?
배열 선언 오류 이네요, 오류 메시지를 보면Caused by: java.lang.ArrayIndexOutOfBoundsException: : length=9; index=9
길이가 9인데 인덱스 9를 사용해서 접근하고 있어요. 8이어야 될 것 같네요  MainActivity.java:48라인 확인해 보세요
...