致命的例外:主要; OOP; JAVA中的RuntimeException

时间:2016-09-28 20:04:07

标签: java android oop getter-setter

我开始学习代码和java。提交的项目由一个名为ReportCard.java的.java文件组成。我不想要一个layout.xml文件。我想创建一个类。我不明白我的错误在哪里。非常感谢你的帮助:))

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) 

3 个答案:

答案 0 :(得分:1)

Android应用程序与控制台应用程序不同。 Android应用程序始终需要以启动活动的形式提供图形入口点,以便平台知道从何处开始执行代码。可以将其视为常规Java应用程序中的main方法。

来自Android Activity Documentation

  

活动是用户可以做的一件重点事。几乎   所有活动都与用户交互,因此Activity类占用   为您创建一个可以放置UI的窗口   的setContentView(查看)。

为了创建ReportClass对象并使用其声明的字段和方法,您需要声明应用程序的入口点。为此,请创建一个新类并将其命名为MyMainActivity

public class MyMainActivity extends Activity
{


}

再次,从Android Activity Documentation

解释
  

onCreate(Bundle)方法几乎所有扩展Activity的类都将实现。您可以在此方法初始化您的活动。最重要的是,在这里,您通常会使用定义UI的布局资源调用setContentView(int),并使用findViewById(int)检索该UI中需要以编程方式进行交互的窗口小部件。

下一步是实现文档中提到的onCreate方法。鉴于您不打算与用户界面进行交互,您只需使用空布局调用setContentView()即可。不要注意Bundle的论点,因为它只会让你感到困惑。

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

您应该在my_empty_layout.xml文件夹中创建/res/layout文件,然后您可以保留生成的内容:

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

您需要做的最后一件事是向平台指定哪个Activity应该是您的应用程序的入口点。即使您只声明了一个,您仍然需要指定它。这是在位于/app/manifests的Android清单文件中完成的。该处已有xml个内容,包括<application> </application>个标记。在此元素中,添加一个活动子节点(<activity>``</activity>),在其中指定所声明活动的完整路径,并使用intent-filter将其标记为应用程序入口点。然后,活动节点应如下所示:

<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个对象并开始搞乱它们:

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

但是,我强烈建议您阅读更多关于Android应用程序的内容以及应该如何创建Android应用程序。您提出的问题表明,您很难理解平台是什么,它是如何实现的,以及您应该如何实现这一目标。

答案 1 :(得分:0)

看看这一行:

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

如果你没有定义一些自定义构造函数 - java会为你创建一个(没有参数的defaul) 但如果你这样做 - 那么你应该定义所有必需的手段。

答案 2 :(得分:0)

我还有一个错误声明,说“没有零参数构造函数”。发生的事情是程序试图从我的DatabaseOpenHelper类启动程序,而不是从主类开始。这样做是因为我首先创建了DatabaseOpenHelper类,然后创建了MainActivity类 该解决方案需要一段时间才能找到,但结果却相当简单。我必须进入清单文件并找到包含“DatabaseOpenHelper”的行,它告诉程序从那里开始,然后将其从“DatabaseOpenHelper”更改为“MainActivity”。