【问题标题】:Unable to instantiate activity. java.lang.IllegalAccessException: void com.example.myapp.FirstActivity.<init>() is not accessible from java.lang.Class无法实例化活动。 java.lang.IllegalAccessException: void com.example.myapp.FirstActivity.<init>() 不能从 java.lang.Class 访问
【发布时间】:2025-11-26 06:00:01
【问题描述】:

每当我启动应用程序时,应用程序都会打开,但只要我单击 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;
    }
}

}

SavedGameActivity:

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();
}
}

Mainfest 文件:

<?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>

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

【问题讨论】:

  • 不要将构造函数添加到您的活动中。另外,我鼓励你改为学习 kotlin。

标签: java android runtime-error illegalaccessexception


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    FirstActivity 类中的默认构造函数没有可见性修饰符。当您不指定可见性修饰符时,将无法从包外部访问该字段或方法。 Android 正在尝试使用空构造函数创建该类,但它不能,因为它与您的类不在同一个包中。 您应该像这样将其设置为公开:

    public FirstActivity() {
    
    }
    

    SavedGameActivity 类也是如此,否则你以后会遇到同样的问题。

    【讨论】:

      【解决方案3】:

      在我看来,您正在尝试使用自定义构造函数来实例化活动,这在 Android 中是不可能的。尝试删除 FirstActivitySavedgameActivity 的构造函数。如果您需要将一些数据传递给活动,您应该将它们作为启动活动的意图的一部分传递。只需删除 public FirstActivity(boolean check, int score1, int score2, boolean chance, int c, int d, String btn)public SavedgameActivity(boolean check, int score1, int score2, boolean chance, int c, int d, String btn) 并重试。

      【讨论】:

      • 自定义构造函数不是问题,但非公开的空构造函数是问题。因为无论如何他根本没有使用那个构造函数。