2016-09-28 5 views
0

私はコードとjavaを学び始めました。投稿されたプロジェクトは、ReportCard.javaという単一の.javaファイルで構成されています。そして、私はlayout.xmlファイルがほしくありません。私はちょうどクラスを作成したい。私は間違いがどこにあるのか分からなかった。非常にあなたの助けをいただき、ありがとうございます:)致命的な例外:メイン; OOP; RuntimeException in Java

package com.example.android.reportcard; public class ReportCard { 

// variable initializations and 
// necessary setters and getter functions 

private String setGrade(int math, int science, int socialStudies) { 
    String grade; 
    mSum = math + science + socialStudies; 
    mPercentage = mSum/TOTAL; 

    if (mPercentage >= 90.0) { 
     grade = "A"; 
    } else if (mPercentage < 90.0 && mPercentage >= 80.0) { 
     grade = "B"; 
    } else if (mPercentage < 80.0 && mPercentage >= 70.0) { 
     grade = "C"; 
    } else if (mPercentage < 70.0 && mPercentage >= 60.0) { 
     grade = "D"; 
    } else if (mPercentage < 60.0) { 
     grade = "Fail"; 
    } else { 
     grade = "error"; 
    } 
    return grade; 
} 


/** 
* Create new report card object. 
* 
* @param schoolName 
* @param teacherName 
* @param year 
* @param studentName 
* @param mathGrade 
* @param scienceGrade 
* @param socialStudiesGrade 
*/ 

public ReportCard(String schoolName, String teacherName, String year, String studentName, 
        int mathGrade, int scienceGrade, int socialStudiesGrade) { 
    mSchoolName = schoolName; 
    mTeacherName = teacherName; 
    mYear = year; 
    mStudentName = studentName; 
    this.mMathGrade = mathGrade; 
    this.mScienceGrade = scienceGrade; 
    this.mSocialStudiesGrade = socialStudiesGrade; 
} 

public String toString() { 
    return "School: " + getSchoolName() + '\n' + 
      "Student Name: " + getStudentName() + '\n' + 
      "Teacher Name: " + getTeacherName() + '\n' + 
      "Year: " + getYear() + '\n' + 
      "Math Grade: " + mMathGrade + '\n' + 
      "Science Grade: " + mScienceGrade + '\n' + 
      "Social Studies Grade: " + mSocialStudiesGrade + '\n' + 
      "Grade: " + setGrade(mMathGrade, mScienceGrade, mSocialStudiesGrade); 
    } 
} 

とエラー:この行で

Process: com.example.android.reportcard, PID: 27731 
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.android.reportcard/com.example.android.reportcard.ReportCard}: java.lang.InstantiationException: java.lang.Class<com.example.android.reportcard.ReportCard> has no zero argument constructor 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.InstantiationException: java.lang.Class<com.example.android.reportcard.ReportCard> has no zero argument constructor 
    at java.lang.Class.newInstance(Native Method) 
    at android.app.Instrumentation.newActivity(Instrumentation.java:1067) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
    at android.app.ActivityThread.-wrap11(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
+0

不要なコードをクラスから削除しました – Sanoop

答えて

2

Androidアプリケーションはコンソールアプリケーションと同じではありません。 Androidアプリケーションでは、プラットフォームがコードの実行を開始する場所を知るために、Launchingアクティビティの形式でグラフィカルなエントリポイントが常に必要です。通常のJavaアプリケーションでは、mainメソッドと考えることができます。 Android Activity Documentationから

An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View).

ReportClassオブジェクトを作成し、その宣言されたフィールドやメソッドを使用するには、アプリケーションのエントリポイントを宣言する必要があります。これを行うには、新しいクラスを作成し、MyMainActivityと呼んでください。

public class MyMainActivity extends Activity 
{ 


} 

再び、Android Activity Documentationから言い換え:

The onCreate(Bundle) method will be implemented by almost all of the classes extending Activity. This method is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource defining your UI, and using findViewById(int) to retrieve the widgets in that UI that you need to interact with programmatically.

次のステップは、ドキュメントに記載されたのonCreateメソッドを実装することです。ユーザーインターフェイスと対話するつもりがない場合は、空のレイアウトを使用してsetContentView()に電話するだけです。バンドルの議論に注意を払わないようにしてください。今のところあなたを混乱させるだけです。

public class MyMainActivity extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super(savedInstanceState); 
     setContentView(R.layout.my_empty_layout); 
    } 
} 

あなたは/res/layoutフォルダにmy_empty_layout.xmlファイルを作成する必要があり、そしてあるとして、あなたは、生成されたコンテンツを残すことができます:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

</LinearLayout> 

あなたがする必要がある最後の事はその活動のプラットフォームに指定されアプリケーションのエントリポイントにする必要があります。あなたが宣言したものの、それを指定する必要があります。これはAndroidマニフェストファイル(/app/manifests)にあります。そこには<application></application>タグを含むxmlのコンテンツが既に存在します。この要素の中に、宣言されたアクティビティへのフルパスを指定するとともに、intent-filterを使用してアプリケーションのエントリポイントとしてマークするアクティビティ子ノード(<activity>``</activity>)を追加します。しかし

public class MyMainActivity extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super(savedInstanceState); 
     setContentView(R.layout.my_empty_layout); 

     ReportCard myFirstReportCard = new ReportCard("SO College", "Mr. Kooijman", "2016", "aylin", 80, 72, 55); 
     int socialStudiesGrade = myFirstReportCard.getSocialStudiesGrade(); 
    } 
} 

<activity android:name="path.to.the.activity.MyMainActivity"> 

    <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 

</activity> 

今、あなたは最終的にあなたのAndroidアプリケーションへのエントリポイントを持っていて、ReportCardオブジェクトの作成を開始し、それらをいじり始めることができます:アクティビティ・ノードは、次のようになります私は、あなたがAndroidアプリケーションが何であるか、またどのようにしてAndroidアプリケーションを作成するべきかについて、さらに詳しくお読みになることを強くお勧めします。あなたが提起した質問は、プラットフォームが何であるか、どのようにしてそれを行うことができるのか、どのように行うべきかを理解していないことを示しています。

+0

ありがとう、ありがとう!はい、もっと頑張る必要があります... – Jenni

0

はルック:

Caused by: java.lang.InstantiationException: java.lang.Class<com.example.android.reportcard.ReportCard> has no zero argument constructor 

あなたはいくつかのカスタムコンストラクタを定義しない場合 - Javaが作成されますあなたのために1つ(パラメータ無しのデフール) もしそうなら、必要なすべてのマニュアルを定義する必要があります。

+0

こんにちは、前に見ましたが、「ゼロ引数のコンストラクタ」を追加したときエラー – Jenni

0

「ゼロ引数のコンストラクタがありません」というエラー文もありました。何が起こっていたのは、プログラムがメインクラスから始めるのではなく、DatabaseOpenHelperクラスからプログラムを開始しようとしていたことでした。これは、まずDatabaseOpenHelperクラスを作成してから、MainActivityクラスを作成したためです。
解決にはしばらく時間がかかりましたが、かなり単純であることが判明しました。私はマニフェストファイルに入って、 "DatabaseOpenHelper"を含む行を見つけなければならなかった。そこでは、 "DatabaseOpenHelper"から "MainActivity"に変更する必要があった。

関連する問題