2016-09-28 3 views
0

Я начал изучать код и java. Представленный проект состоит из одного .java-файла под названием ReportCard.java. И я не хочу файл layout.xml. Я хочу создать класс. Я не понял, где моя ошибка. Большое спасибо вашей помощи :)FATAL EXCEPTION: main; ООП; RuntimeException в 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 всегда требуется графическая точка входа в виде запуска, чтобы платформа могла знать, с чего начать выполнение кода. Подумайте об этом как метод main в обычных Java-приложениях.

Из 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> 

Последнее, что вам нужно сделать, это указать на платформу, деятельность должен быть точкой входа в ваше приложение. Даже если вы только объявили один, вам все равно нужно будет указать его. Это делается в файле манифеста Android, расположенном по адресу /app/manifests. Там будет уже xml, в том числе тег . Внутри этого элемента добавьте дочерний узел активности (<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-приложение, и как его нужно создавать. Вопрос, который вы задали, указывает на то, что вы не понимаете, что такое платформа, как и что она позволяет вам делать, и как вы должны это делать.

+0

Большое спасибо! Да, мне нужно больше работать ... – Jenni

0

Посмотрите на этой линии:

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

Если вы не определить некоторые пользовательские конструктор - Java создает один для вас (defaul без параметров) Но если вы это сделаете - тогда вы должны определить каждый необходимый мануал.

+0

Здравствуйте, я видел его раньше, но когда я добавлял «no zero argument constructor» i получить ошибку – Jenni

0

У меня также было сообщение об ошибке, в котором говорилось, что «не имеет конструктора нулевых аргументов». Случалось, что программа пыталась запустить программу из моего класса DatabaseOpenHelper вместо запуска в основном классе. Он делал это, потому что сначала создал класс DatabaseOpenHelper, а затем создал класс MainActivity.
Решение потребовалось некоторое время, чтобы найти, но оказалось довольно простым. Мне пришлось зайти в файл манифеста и найти строку, включая «DatabaseOpenHelper», где она говорила программе, чтобы начать там, а затем изменить ее с «DatabaseOpenHelper» на «MainActivity».