質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.41%

  • Android

    6866questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4026questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Kotlin

    473questions

    Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

[Android Kotlin] MainActivityでClassNotFoundが発生してしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 71

audoc314159

score 3

前提・実現したいこと

AndroidStudioで、Fragmentの挙動を勉強するためのアプリを作っています。
ですが、AVDで動作確認をしようとする際に、「MainActivityがないよ」という旨の
ClassNotFoundExceptionが発生してしまいます。

発生している問題・エラーメッセージ

01-13 23:17:30.605 13912-13912/com.audoc314159.androidaurum E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.audoc314159.androidaurum, PID: 13912
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.audoc314159.androidaurum/com.audoc314159.androidaurum.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.audoc314159.androidaurum.MainActivity" on path: DexPathList[[zip file "/data/app/com.audoc314159.androidaurum-2/base.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]

.
.
.


Caused by: java.lang.ClassNotFoundException: Didn't find class "com.audoc314159.androidaurum.MainActivity" on path: DexPathList[[zip file "/data/app/com.audoc314159.androidaurum-2/base.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.audoc314159.androidaurum-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2226)
        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) 
        Suppressed: java.io.IOException: Zip archive '/data/app/com.audoc314159.androidaurum-2/split_lib_slice_2_apk.apk' doesn't contain classes.dex (error msg: Entry not found)
        at dalvik.system.DexFile.openDexFileNative(Native Method)
        at dalvik.system.DexFile.openDexFile(DexFile.java:295)
        at dalvik.system.DexFile.<init>(DexFile.java:80)
        at dalvik.system.DexFile.<init>(DexFile.java:59)
        at dalvik.system.DexPathList.loadDexFile(DexPathList.java:262)
        at dalvik.system.DexPathList.makeDexElements(DexPathList.java:231)
            at dalvik.syst

作成したクラス内でエラーが発生しているわけではなく、 かつコンパイルとビルド自体は成功するため文法等の問題ではないような気がしているのですが、原因が全くつかめていません。

よく見るとMainActivityクラスのクラス名に黄色いハイライトがかかっているのに気づきました。
Warningの内容は

The <activity> MainActivity is not registered in the manifest
Activities, services and content providers should be registered in the AndroidManifest.xml file using <activity>, <service> and <provider> tags.  If your activity is simply a parent class intended to be subclassed by other "real" activities, make it an abstract class.  Issue id: Registered

と出ていたのでマニフェスト関連のエラーかもしれません。

以下AndroidManifestとMainActivity.ktとactivity_main.xmlです。

該当のソースコード

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.audoc314159.androidaurum">

    <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/AppTheme">
        <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>
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.audoc314159.androidaurum.R
import com.audoc314159.androidaurum.R.layout.activity_main

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(activity_main)

        //初期表示??
        if (savedInstanceState == null) {

            // fragmentManagerのインスタンス生成
            val fragmentManager = supportFragmentManager
            // FragmentTransactionのインスタンスを取得
            val fragmentTransaction = fragmentManager.beginTransaction()

            // BackStackを設定
            //これをトランザクションに設定すると、トランザクションの開始時のFragment状態がスタックに積まれて、
            //戻るボタンで前の状態に戻ることが可能になる。
            fragmentTransaction.addToBackStack(null)

            // インスタンスに対して張り付け方を指定する
            //引数で、Fragmentに使わせたいものを渡す
            //遷移先指定
            fragmentTransaction.replace(R.id.id_fl_intro, IntroFragment.newInstance(""))

            /*
                add(int containerViewId, Fragment fragment)
                add(int containerViewId, Fragment fragment, String tag)
                remove(Fragment fragment)

                置き換え、remove()してadd()すること
                replace(int containerViewId, Fragment fragment)
                replace(int containerViewId, Fragment fragment, String tag)

                Fragmentを非表示にする
                hide(Fragment fragment)

                hideされたものを表示させる
                show(Fragment fragment)

                UIからは外れるがFragmentMangerでactiveな状態として管理されている
                detach(Fragment fragment)

                detachされたものをattachする
                attach(Fragment fragment)
                */

            // 張り付けを実行
            fragmentTransaction.commit()
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="MainActivity" tools:layout_editor_absoluteY="81dp">

    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent" android:id="@+id/id_fl_intro">

    </FrameLayout>
    <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent" android:id="@+id/id_ll_main">
        <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="262dp" android:id="@+id/id_fl_battle">

        </FrameLayout>
        <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="161dp" android:id="@+id/id_fl_message">

        </FrameLayout>
        <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent" android:id="@+id/id_fl_buttons">

        </FrameLayout>
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

試したこと

  • プロジェクトのクリーン、リビルド
  • 「./.gradle」「./app/build」「./build」以下のファイルの削除、リビルド
  • レイアウト系xmlで赤文字になっていた箇所は全て修正し、見た目はエラーがない状態に

補足情報(FW/ツールのバージョンなど)

  • AndroidStudio 3.2.1
  • kotlin_version '1.2.71'

初心者かつ質問させていただくのが初めての為、情報が足りなかったら申し訳ありませんが、
何卒よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • keicha_hrs

    2019/01/14 22:14 編集

    Kotlinソースコードの1行目にpackage文がないのは、実際のコード上には存在するものを提示する際に省いたのでしょうか?実際のコード上でも除去されているのでしょうか?

    キャンセル

  • audoc314159

    2019/01/17 12:05

    環境のせいかコメントできているか定かでないため、何重かに送られてしまっていたらすみません。パッケージ宣言はもともと省いてしまっていたのですが、追記したところ正常に動作するようになりました。ありがとうございます。ベストアンサーとさせていただきたいので、ぜひ回答としてご記入いただければと思います。

    キャンセル

  • keicha_hrs

    2019/01/17 12:45

    推測が当たったようで、解決して良かったです。なぜpackage文が抜けるとエラーになるのかの原理も含めて回答欄に記述しました。

    キャンセル

回答 1

checkベストアンサー

+1

Androidのパッケージマネージャーでは、実行するクラスのインスタンスを生成するために、リフレクションという機能を使っています。リフレクションでは、対象のクラスの完全修飾名が必要です。その情報源とするために、AndroidManifest.xmlにpackageを記述したり、activityタグのandroid:name属性にクラス名を指定しています。

一方で、JavaやKotlinのソースコードでは、一般的に1行目に

package com.audoc314159.androidaurum

のようなpackage文を記述します。これと、同じソースファイルに記述されたクラス名を合わせることで、コンパイラーはこのクラスの完全修飾名を得ることができます。

今回の問題では、package文の記述が抜けてしまったために、Androidのパッケージマネージャーがマニフェストで指定されているクラスを見つけることができず、アプリケーションを開始することができなかったということだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/17 19:31

    わかりやすい解説をありがとうございます。Kotlinだとパッケージ宣言を書かなくてもコンパイルエラーにならないようで当たり前のことを見落としていました……ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.41%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Android

    6866questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    4026questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • Kotlin

    473questions

    Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。