致命例外:main;面向对象;运行时异常在JAVA

问题描述:

我开始学习代码和java.The提交的项目由一个单一的.java文件,标题为ReportCard.java。我不想要一个layout.xml文件。我想创建一个班级。我不明白我的错误在哪里。非常感谢您的帮助:)致命例外:main;面向对象;运行时异常在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

Android应用程序与控制台应用程序不同。 Android应用程序总是需要启动活动形式的图形入口点,以便平台知道从何处开始执行代码。把它看作普通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()。不要关注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> 

你需要做的最后一件事是指定的平台,活动应该是您的应用程序的入口点。即使你只声明了一个,你仍然需要指定它。这在位于/app/manifests的Android Manifest文件中完成。这里将会有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应用程序。您提出的问题表明,对平台是什么以及如何以及如何做以及应该如何做这些问题缺乏理解。

+0

非常感谢!是的,我需要更努力工作...... – Jenni

看这句话:

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

如果不定义一些自定义的构造函数 - 创建的java一个给你(默认没有参数) 但是,如果你这样做 - 那么你应该定义每个需要的手册。

+0

你好,我看到它之前,但当我被添加“无零参数构造函数”我 接收错误 – Jenni

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