首页 > 解决方案 > 无法实例化活动。java.lang.IllegalAccessException:无效 com.example.myapp.FirstActivity。() 不能从 java.lang.Class 访问

问题描述

每当我启动应用程序时,应用程序都会打开,但只要我单击 mainactivity 的按钮 1 或按钮 2 中的任何一个,我就会收到此错误:

java.lang.RuntimeException: Unable to instantiate activity 
ComponentInfo{com.example.myapp/com.example.myapp.FirstActivity}: java.lang.IllegalAccessException: 
void com.example.myapp.FirstActivity.<init>() is not accessible from 
java.lang.Class<android.app.AppComponentFactory>
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3341)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at 
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7814)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
     Caused by: java.lang.IllegalAccessException: void com.example.myapp.FirstActivity.<init>() is 
not accessible from java.lang.Class<android.app.AppComponentFactory>
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1251)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3329)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at 
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:237) 
        at android.app.ActivityThread.main(ActivityThread.java:7814) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)

我正在尝试制作一个带有保存功能的井字游戏,其中所有数据都进入 SQLite 数据库,然后检索数据以玩保存的游戏。每当我按下任何按钮时,应用程序都会崩溃并出现上述错误。我在自己的手机 android 11 中运行我的应用程序。

我的代码:

主要活动 :

package com.example.myapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

    Button btn1 = findViewById(R.id.btn1);
    btn1.setOnClickListener(this);
    Button btn2 = findViewById(R.id.btn2);
    btn2.setOnClickListener(this);
    Button btn3 = findViewById(R.id.btn3);
    btn3.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    switch(view.getId()) {
        case R.id.btn1 :
            Intent intent1 = new Intent(this, FirstActivity.class);
            intent1.putExtra("KEY1", "VALUE1");
            startActivity(intent1);
            break;
        case R.id.btn2 :
            Intent intent2 = new Intent(this, SavedgameActivity.class);
            intent2.putExtra("KEY2", "VALUE2");
            startActivity(intent2);
            break;
        case R.id.btn3 :
            break;
    }
}

}

第一活动:

package com.example.myapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.ArrayList;

public class FirstActivity extends AppCompatActivity implements View.OnClickListener {

ArrayList<Integer> a = new ArrayList<Integer>(9);
ArrayList<Integer> b = new ArrayList<Integer>(9);
boolean chance = true;
int c=-1,d=-1;
Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn10, btn11;
TextView txtview4;
TextView txtview5;
int score1 = 0, score2 = 0;
String savename = "";
DBhelper db;

FirstActivity() {

}

public FirstActivity(boolean check, int score1, int score2, boolean chance, int c, int d, String btn) 
{
    this.chance = chance;
    this.score1 = score1;
    this.score2 = score2;
    this.chance = chance;
    this.c = c;
    this.d = d;
    btn1.setText(btn.charAt(0));
    btn2.setText(btn.charAt(1));
    btn3.setText(btn.charAt(2));
    btn4.setText(btn.charAt(3));
    btn5.setText(btn.charAt(4));
    btn6.setText(btn.charAt(5));
    btn7.setText(btn.charAt(6));
    btn8.setText(btn.charAt(7));
    btn9.setText(btn.charAt(8));
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);
    txtview4 = findViewById(R.id.textView4);
    txtview5 = findViewById(R.id.textView5);
    btn1 = findViewById(R.id.button1);
    btn2 = findViewById(R.id.button2);
    btn3 = findViewById(R.id.button3);
    btn4 = findViewById(R.id.button4);
    btn5 = findViewById(R.id.button5);
    btn6 = findViewById(R.id.button6);
    btn7 = findViewById(R.id.button7);
    btn8 = findViewById(R.id.button8);
    btn9 = findViewById(R.id.button9);
    btn10 = findViewById(R.id.button10);
    btn11 = findViewById(R.id.button11);
    btn1.setOnClickListener(this);
    btn2.setOnClickListener(this);
    btn3.setOnClickListener(this);
    btn4.setOnClickListener(this);
    btn5.setOnClickListener(this);
    btn6.setOnClickListener(this);
    btn7.setOnClickListener(this);
    btn8.setOnClickListener(this);
    btn9.setOnClickListener(this);
    btn10.setOnClickListener(this);
    btn11.setOnClickListener(this);
    
    db = new DBhelper(this);
}

@Override
public void onClick(View view) {
    switch(view.getId()) {
        case R.id.button1 :
            if(chance == true) {
                c = c+1;
                a.add(c, 1);
                btn1.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 1);
                btn1.setText("O");
            }
            break;
        case R.id.button2 :
            if(chance == true) {
                c = c+1;
                a.add(c, 2);
                btn2.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 2);
                btn2.setText("O");
            }
             break;
        case R.id.button3 :
            if(chance == true) {
                c = c+1;
                a.add(c, 3);
                btn3.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 3);
                btn3.setText("O");
            }
            break;
        case R.id.button4 :
            if(chance == true) {
                c = c+1;
                a.add(c, 4);
                btn4.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 4);
                btn4.setText("O");
            }
            break;
        case R.id.button5 :
            if(chance == true) {
                c = c+1;
                a.add(c, 5);
                btn5.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 5);
                btn5.setText("O");
            }
            break;
        case R.id.button6 :
            if(chance == true) {
                c = c+1;
                a.add(c, 6);
                btn6.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 6);
                btn6.setText("O");
            }
            break;
        case R.id.button7 :
            if(chance == true) {
                c = c+1;
                a.add(c, 7);
                btn7.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 7);
                btn7.setText("O");
            }
            break;
        case R.id.button8 :
            if(chance == true) {
                c = c+1;
            a.add(c, 8);
            btn8.setText("X");
        }
            else {
                d = d+1;
            b.add(d, 8);
            btn8.setText("O");
        }
        break;
        case R.id.button9 :
            if(chance == true) {
                c = c+1;
                a.add(c, 9);
                btn9.setText("X");
            }
            else {
                d = d+1;
                b.add(d, 9);
                btn9.setText("O");
            }
            break;
        case R.id.button10 :
            String btn = btn1.getText().toString() + btn2.getText().toString() + 
btn3.getText().toString() + btn4.getText().toString() + btn5.getText().toString() + 
btn6.getText().toString() + btn7.getText().toString() + btn8.getText().toString() + 
btn9.getText().toString();

            SavedgameActivity sga = new SavedgameActivity(false, score1, score2, chance, c, d, btn);

            Intent intent = new Intent(FirstActivity.this, SavedgameActivity.class);
            intent.putExtra("KEY3", "VALUE3");
            startActivity(intent);

            break;
        case R.id.button11 :
            finish();
            break;
    }

    if(chance == true)
         chance = false;
    else
        chance = true;

    if((a.contains(1) && a.contains(2) && a.contains(3))||(a.contains(4) && a.contains(5) && 
a.contains(6))||((a.contains(7) && a.contains(8) && a.contains(9)))||(a.contains(1) && a.contains(4) 
&& a.contains(7))||(a.contains(2) && a.contains(5) && a.contains(8))||(a.contains(3) && a.contains(6) 
&& a.contains(9))||(a.contains(1) && a.contains(5) && a.contains(9))||(a.contains(3) && a.contains(5) 
&& a.contains(7))) {
        score1++;
        txtview4.setText("" + score1);
        btn1.setText("");
        btn2.setText("");
        btn3.setText("");
        btn4.setText("");
        btn5.setText("");
        btn6.setText("");
        btn7.setText("");
        btn8.setText("");
        btn9.setText("");
        c = -1;
        d = -1;
        a.clear();
        b.clear();
        if((score1 + score2)%2 == 0)
            chance = true;
        else
            chance = false;
    }
    else if((b.contains(1) && b.contains(2) && b.contains(3))||(b.contains(4) && b.contains(5) && 
b.contains(6))||((b.contains(7) && b.contains(8) && b.contains(9)))||(b.contains(1) && b.contains(4) 
&& b.contains(7))||(b.contains(2) && b.contains(5) && b.contains(8))||(b.contains(3) && b.contains(6) 
&& b.contains(9))||(b.contains(1) && b.contains(5) && b.contains(9))||(b.contains(3) && b.contains(5) 
&& b.contains(7))) {
        score2++;
        txtview5.setText("" + score2);
        btn1.setText("");
        btn2.setText("");
        btn3.setText("");
        btn4.setText("");
        btn5.setText("");
        btn6.setText("");
        btn7.setText("");
        btn8.setText("");
        btn9.setText("");
        c = -1;
        d = -1;
        a.clear();
        b.clear();
        if ((score1 + score2) % 2 == 0)
            chance = true;
        else
            chance = false;
    }
}

}

保存游戏活动:

package com.example.myapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class SavedgameActivity extends AppCompatActivity {
boolean check = true;
int score1;
int score2;
boolean chance, dialogcheck, isupdated, isinserted;
int c;
int d;
String btn;
DBhelper db = new DBhelper(this);

TextView txt6, txt7, txt8;
Button btn12, btn13, btn14;

SavedgameActivity() {

}

public SavedgameActivity(boolean check, int score1, int score2, boolean chance, int c, int d, String 
btn) {
    this.check = check;
    this.score1 = score1;
    this.score2 = score2;
    this.chance = chance;
    this.c = c;
    this.d = d;
    this.btn = btn;
}

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

    if(check == false) {
        falsemethod();
    }
    else
        truemethod();
}

public void falsemethod() {
    btn12 = findViewById(R.id.button12);
    btn13 = findViewById(R.id.button13);
    btn14 = findViewById(R.id.button14);
    txt6 = findViewById(R.id.textView6);
    txt7 = findViewById(R.id.textView7);
    txt8 = findViewById(R.id.textView8);
    Cursor savegame1 =  db.getgame(txt6.getText().toString());
    Cursor savegame2 =  db.getgame(txt7.getText().toString());
    Cursor savegame3 =  db.getgame(txt8.getText().toString());

    ArrayList<String> itemIds1 = new ArrayList<String>();
    while(savegame1.moveToNext()) {
        itemIds1.add(savegame1.getString(savegame1.getColumnIndex("id")));
    }
    savegame1.close();

    ArrayList<String> itemIds2 = new ArrayList<String>();
    while(savegame2.moveToNext()) {
        itemIds2.add(savegame2.getString(savegame2.getColumnIndex("id")));
    }
    savegame2.close();

    ArrayList<String> itemIds3 = new ArrayList<String>();
    while(savegame3.moveToNext()) {
        itemIds3.add(savegame3.getString(savegame3.getColumnIndex("id")));
    }
    savegame3.close();

    if(Integer.parseInt(itemIds1.get(0)) < 1)
        btn12.setText("Save");
    else
        btn12.setText("Override and Save");
    if(Integer.parseInt(itemIds2.get(0)) < 1)
        btn12.setText("Save");
    else
        btn12.setText("Override and Save");
    if(Integer.parseInt(itemIds2.get(0)) < 1)
        btn12.setText("Save");
    else
        btn12.setText("Override and Save");

    btn12.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(Integer.parseInt(itemIds1.get(0)) < 1)
                isinserted = db.addgame(score1, score2, chance, c, d, btn);
            else
                isupdated = db.updategame(score1, score2, chance, c, d, btn, 
btn12.getText().toString());
        }
    });
    btn13.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(Integer.parseInt(itemIds2.get(0)) < 1)
                isinserted = db.addgame(score1, score2, chance, c, d, btn);
            else
                isupdated = db.updategame(score1, score2, chance, c, d, btn, 
btn13.getText().toString());
        }
    });
    btn14.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(Integer.parseInt(itemIds3.get(0)) < 1)
                isinserted = db.addgame(score1, score2, chance, c, d, btn);
            else
                isupdated = db.updategame(score1, score2, chance, c, d, btn, 
btn14.getText().toString());
        }
    });

    if((isinserted == true) || (isupdated == true))
        Toast.makeText(SavedgameActivity.this, "Game Saved", Toast.LENGTH_LONG).show();
    else
        Toast.makeText(SavedgameActivity.this, "Game Not Saved", Toast.LENGTH_LONG).show();

}

public void truemethod() {
    btn12.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Cursor Getgame = db.getgame(txt6.getText().toString());
            ArrayList<Long> itemIds = new ArrayList<Long>();
            while(Getgame.moveToNext()) {
                long itemId = Getgame.getLong(
                        Getgame.getColumnIndexOrThrow("id"));
                itemIds.add(itemId);
            }
            Getgame.close();
            if (itemIds.get(0) < 1)
                Toast.makeText(SavedgameActivity.this, "Game not saved yet", Toast.LENGTH_LONG).show();
            else {
                FirstActivity fa = new FirstActivity(check, score1, score2, chance, c, d, btn);

                Intent intent = new Intent();
                intent.putExtra("KEY4", "VALUE4");
                startActivity(intent);
            }
        }
    });
}

public void setCheck(boolean check) {
    this.check = check;
}

}

DBhelper 类:

package com.example.myapp;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class DBhelper extends SQLiteOpenHelper {

SQLiteDatabase db = this.getWritableDatabase();
SQLiteDatabase db1 = this.getReadableDatabase();

public DBhelper(@Nullable Context context) {
    super(context, "Database", null, 1);
    SQLiteDatabase database = this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE Save(id INTEGER PRIMARY KEY AUTOINCREMENT, score1 INTEGER, score2 
INTEGER, chance BOOLEAN, c INTEGER, d INTEGER, btn TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}

public boolean addgame(int Score1, int Score2, boolean Chance, int C, int D, String Btn) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues cv = new ContentValues();
    cv.put("score1", Score1);
    cv.put("score2", Score2);
    cv.put("chance", Chance);
    cv.put("c", C);
    cv.put("d", D);
    cv.put("btn", Btn);

    long result = db.insert("Save", null, cv);

    if(result == -1)
        return false;
    else
        return true;
}

public Cursor getgame(String a) {
    Cursor res = db.query("Save", null, "id = ?", new String[]{a}, null, null, "btn DESC");
    return res;
}

public boolean updategame(int Score1, int Score2, boolean Chance, int C, int D, String Btn, String 
id) {
    int nameid = Integer.parseInt(id);

    ContentValues cv = new ContentValues();
    cv.put("id", nameid);
    cv.put("score1", Score1);
    cv.put("score2", Score2);
    cv.put("chance", Chance);
    cv.put("c", C);
    cv.put("d", D);
    cv.put("btn", Btn);

    long result =  db1.update("Save", cv, "id = ?", new String[]{id});

    if(result == -1)
        return false;
    else
        return true;
}

public void closedb() {
    db.close();
}
}

主要文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApp">
        <activity android:name=".SavedgameActivity" />
        <activity android:name=".FirstActivity" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

请给我一个解决方案。谢谢。

标签: javaandroidruntime-errorillegalaccessexception

解决方案


您的 Activity 空构造函数受到保护。因此它无法访问。你永远不应该让你的活动为非公开的空构造函数。

并且要将您想要传递给 Activity 的变量传递给 Intent,您可以将它们作为附加项传递,您可以在活动的 onCreate() 中提取这些变量。


推荐阅读