簡體   English   中英

android中提供的正確類時發生類未找到異常發生

[英]class not found exception occur when correct class supplied in android

這是我的Activity類中的代碼部分。 這是onListItemClick方法。 我使用String數組輸入菜單活動類名稱。 classes是數組。

protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        String cheese = classes[position];
        try {
            Class ourClass = Class.forName("com.example.image_and_sound_app."+cheese);
            Intent ourIntent = new Intent(Menu.this,ourClass);
            startActivity(ourIntent);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

但是當我單擊列表項時會發生異常

nd_sound_app.app W/System.err﹕ Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.image_and_sound_app.MainActivity" on path: DexPathList[[zip file "/data/app/com.example.image_and_sound_app.app-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.image_and_sound_app.app-2, /system/lib]]
07-09 15:50:14.220    1288-1288/com.example.image_and_sound_app.app W/System.err﹕ at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
07-09 15:50:14.220    1288-1288/com.example.image_and_sound_app.app W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
07-09 15:50:14.220    1288-1288/com.example.image_and_sound_app.app W/System.err﹕ at java.lang.ClassLoader.loadClass(ClassLoader.java:457)

已經存在MainActivity類。 但是異常表明找不到該類。 我該如何解決?

所以您給錯了班級名稱。 MainActivity類名稱不是:com.example.image_and_sound_app.MainActivity。 仔細檢查主要活動的所屬包名稱。 別無所求。

抱歉,如果我不使用comment選項,我的代表就太低了。 我知道如何幫助你...

我看到您在buckysroom上執行了Android教程。

您在上面的注釋中寫的不是mainactivity的聲明。 您僅在此處建立到活動本身的鏈接。

String classes[] = {"MainActivity", "TextPlay", "Email", "Notebook", "example4", "example5", "example6" };

此行僅是數組,以后的代碼將在該數組中建立鏈接。

 Class ourClass = null;
    try {
        ourClass = Class.forName("com.awo.travistut."+links);
        Intent ourIntent = new Intent(Menu.this, ourClass);
        startActivity(ourIntent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

這是缺少的主要課程:

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SoundEffectConstants;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

int counter;
Button add, sub;
TextView display;

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

    counter = 0;
    add = (Button) findViewById(R.id.bAdd);
    sub = (Button) findViewById(R.id.bDelete);
    display = (TextView) findViewById(R.id.tvDisplay);

    add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            counter = counter+1;
            display.setText("Your total is " + counter);
            v.playSoundEffect(SoundEffectConstants.CLICK);
        }
    });

    sub.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            counter = counter-1;
            display.setText("Your total is " + counter);
            v.playSoundEffect(SoundEffectConstants.CLICK);
        }
    });

}


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

@Override
protected void onPause(){
    super.onPause();
    finish();
}

}

這是構建其導航的菜單代碼:

public class Menu extends ListActivity {

String classes[] = {"MainActivity", "TextPlay", "Email", "Notebook", "example4", "example5", "example6" };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position, id);

    String links = classes[position];

    Class ourClass = null;
    try {
        ourClass = Class.forName("com.awo.travistut."+links);
        Intent ourIntent = new Intent(Menu.this, ourClass);
        startActivity(ourIntent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}

為什么你們將解決方法拉到簡單的問題上? 除了使用反射,您還可以執行更有效,更可靠的方法。 這是您的代碼:

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    String cheese = classes[position];
    try {
        Class ourClass = Class.forName("com.example.image_and_sound_app."+cheese);
        Intent ourIntent = new Intent(Menu.this,ourClass);
        startActivity(ourIntent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

假設類為:

private static final String[] classes = {
    "A",
    "B",
    "C"
};

等等。 與其動態地構建類,不如構建它們!

private static final Class<?>[] classes = {
    A.class,
    B.class,
    C.class
};

...

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id); // this line is redundant
    Class<?> ourClass = classes[position];
    Intent ourIntent = new Intent(Menu.this,ourClass);
    startActivity(ourIntent);
}

導航處理也有很好的模式,但我不知道您是否會使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM