我开始学习代码和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)
答案 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”。