Java 应用程序没有';由于ClassCastException,无法运行

Java 应用程序没有';由于ClassCastException,无法运行,java,android,Java,Android,我对Java和Android应用程序非常陌生。我不知道我现在的练习代码会发生什么。它不断被java.lang.RuntimeException:无法启动活动组件信息{}:java.lang.ClassCastException:android.widget.LinearLayout强制关闭 Logcat 07-28 17:29:44.870: D/AndroidRuntime(518): Shutting down VM 07-28 17:29:44.870: W/dalvikvm(518):

我对Java和Android应用程序非常陌生。我不知道我现在的练习代码会发生什么。它不断被
java.lang.RuntimeException:无法启动活动组件信息{}:java.lang.ClassCastException:android.widget.LinearLayout
强制关闭

Logcat

07-28 17:29:44.870: D/AndroidRuntime(518): Shutting down VM

07-28 17:29:44.870: W/dalvikvm(518): threadid=1: thread exiting with uncaught exception (group=0x40015560)

07-28 17:29:44.880: E/AndroidRuntime(518): FATAL EXCEPTION: main

07-28 17:29:44.880: E/AndroidRuntime(518): java.lang.RuntimeException: Unable to start 
activity     
ComponentInfo{com.Elson.ProjectVersion/com.Elson.ProjectVersion.EnterScoresActivity}:      java.lang.ClassCastException: android.widget.LinearLayout

07-28 17:29:44.880: E/AndroidRuntime(518):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)

07-28 17:29:44.880: E/AndroidRuntime(518):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

07-28 17:29:44.880: E/AndroidRuntime(518):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)

07-28 17:29:44.880: E/AndroidRuntime(518):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

07-28 17:29:44.880: E/AndroidRuntime(518):  at android.os.Handler.dispatchMessage(Handler.java:99)

07-28 17:29:44.880: E/AndroidRuntime(518):  at android.os.Looper.loop(Looper.java:130)

07-28 17:29:44.880: E/AndroidRuntime(518):  at android.app.ActivityThread.main(ActivityThread.java:3683)

07-28 17:29:44.880: E/AndroidRuntime(518):  at    java.lang.reflect.Method.invokeNative(Native Method)

07-28 17:29:44.880: E/AndroidRuntime(518):  at 
java.lang.reflect.Method.invoke(Method.java:507)

07-28 17:29:44.880: E/AndroidRuntime(518):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

07-28 17:29:44.880: E/AndroidRuntime(518):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

07-28 17:29:44.880: E/AndroidRuntime(518):  at dalvik.system.NativeStart.main(Native Method)
07-28 17:29:44.880: E/AndroidRuntime(518): Caused by: java.lang.ClassCastException: android.widget.LinearLayout

07-28 17:29:44.880: E/AndroidRuntime(518):  at com.Elson.ProjectVersion.EnterScoresActivity.setUpViews(EnterScoresActivity.java:142)

07-28 17:29:44.880: E/AndroidRuntime(518):  at com.Elson.ProjectVersion.EnterScoresActivity.onCreate(EnterScoresActivity.java:42)
07-28 17:29:44.880: E/AndroidRuntime(518):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

07-28 17:29:44.880: E/AndroidRuntime(518):  at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

.xml文件(输入_scores.xml)


EnterScoresActivity.java

package com.Elson.ProjectVersion;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.content.DialogInterface;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;

public class EnterScoresActivity extends Activity {

private Button saveButton;
private Button historyButton;
private EditText game1ScoreEditText;
private EditText game2ScoreEditText;
private EditText game3ScoreEditText;
private TextView date;
private TextView seriesTotal;
private Button changeDateButton;


private int month;//private within class
private int day;
private int year;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.enter_scores);

    setUpViews();


    //put today's date on the screen
    Calendar calendar =Calendar.getInstance();
    year = calendar.get(Calendar.YEAR);
    month = calendar.get(Calendar.MONTH);
    day = calendar.get(Calendar.DAY_OF_MONTH);

    Date today = calendar.getTime();
    DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
    String cs = df.format(today);
    date.setText(cs);
}

/*
 * Get the 3 scores from the interface, validate the scores
 create an object to hold the scores.
 */

public void saveClickHandler(View v){
    String rawScore; 
    rawScore = game1ScoreEditText.getText().toString();
    int score1 = Integer.parseInt(rawScore);
    rawScore = game2ScoreEditText.getText().toString();
    int score2 = Integer.parseInt(rawScore);
    rawScore = game3ScoreEditText.getText().toString();
    int score3 = Integer.parseInt(rawScore);

    Log.d("EnterScores" , "I hear the Save Button");


    if( isValid(score1) && isValid(score2) && isValid(score3) ) {
        BowlingScores bowlingScores;
        Date dateofGames= new Date(year,month,day);
        bowlingScores= new BowlingScores(score1, score2, score3, dateofGames);

        seriesTotal.setText(bowlingScores.calculateSeriesScore() );

        MyBowlingScoresApplication app  = (MyBowlingScoresApplication) getApplication();
        app.addBowlingScores(bowlingScores);


    }else {
        //pop up a dialog that dad is invalid
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Invalid Scores")
               .setMessage("Bowling scores cannot be greater than 300")
               .setCancelable(false)
               .setPositiveButton("OK", 

                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        dialog.cancel(); 
                    }
                });

        AlertDialog alert = builder.create();
        alert.show();

    }
}

private boolean isValid(int score){
    if(score >=0 && score <=300)
        return true;
    return false;
}

public void changeDateClickHandler(View v){
    Log.d("Enter Scores", "I heear the Change Date Button");

    DatePickerDialog.OnDateSetListener datePickerListener;

    datePickerListener = new DatePickerDialog.OnDateSetListener(){

        @Override
        public void onDateSet(DatePicker view, int yearOfYear, int monthOfYear,
                int dayOfMonth) {
            // TODO Auto-generated method stub
            year=yearOfYear;
            month= monthOfYear;
            day=dayOfMonth;

            Calendar cal= new GregorianCalendar(year , month , day);
            Date dateofGames = cal.getTime();
            DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
            String cs= df.format(dateofGames);
            date.setText(cs);
        } 

    };

    DatePickerDialog dpd = new DatePickerDialog(this,datePickerListener,year,month,day);
    dpd.show();
}
private void setUpViews(){
    saveButton= (Button) findViewById(R.id.SaveButton);
    game1ScoreEditText =(EditText) findViewById(R.id.Game1EditText);
    game2ScoreEditText =(EditText) findViewById(R.id.Game2EditText);
    game3ScoreEditText =(EditText) findViewById(R.id.Game3EditText);
    date = (TextView) findViewById(R.id.DateTextView);
    seriesTotal = (TextView) findViewById(R.id.SeriesTotalTextView);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.enter_scores, menu);
    return true;
}

}
package com.Elson.ProjectVersion;
导入java.text.DateFormat;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.GregorianCalendar;
导入android.os.Bundle;
导入android.app.Activity;
导入android.app.AlertDialog;
导入android.app.DatePickerDialog;
导入android.content.DialogInterface;
导入android.util.Log;
导入android.view.Menu;
导入android.view.view;
导入android.widget.Button;
导入android.widget.DatePicker;
导入android.widget.EditText;
导入android.widget.TextView;
公共类EnterScoresActivity扩展了活动{
私人按钮保存按钮;
私有按钮历史按钮;
私人EditText游戏1 CoreEditText;
私人EditText游戏2 CoreEditText;
私人编辑文本游戏;
私有文本查看日期;
私有文本视图序列汇总;
私有按钮changeDateButton;
private int month;//类内的private
私人国际日;
私人国际年;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.输入分数);
setupview();
//在屏幕上显示今天的日期
日历=Calendar.getInstance();
year=calendar.get(calendar.year);
month=calendar.get(calendar.month);
day=calendar.get(calendar.day/u月);
Date today=calendar.getTime();
DateFormat df=DateFormat.getDateInstance(DateFormat.MEDIUM);
字符串cs=df.format(今天);
日期:setText(cs);
}
/*
*从界面获取3个分数,验证分数
创建一个对象来保存分数。
*/
公共无效saveClickHandler(视图v){
弦乐谱;
rawScore=game1ScoreEditText.getText().toString();
int score1=整数.parseInt(rawScore);
rawScore=game2ScoreEditText.getText().toString();
int score2=整数.parseInt(rawScore);
rawScore=game3scoredittext.getText().toString();
int score3=整数.parseInt(rawScore);
Log.d(“输入分数”,“我听到保存按钮”);
if(isValid(分数1)和isValid(分数2)和isValid(分数3)){
保龄球核心;
Date dateofGames=新日期(年、月、日);
保龄球得分=新的保龄球得分(得分1、得分2、得分3、得分日期);
seriesTotal.setText(bowlingScores.calculatesriesscore());
MyBowlingScoresApplication应用程序=(MyBowlingScoresApplication)getApplication();
附录.添加BowlingCores(BowlingCores);
}否则{
//弹出一个爸爸无效的对话框
AlertDialog.Builder=新建AlertDialog.Builder(此);
builder.setTitle(“无效分数”)
.setMessage(“保龄球分数不能大于300”)
.setCancelable(错误)
.setPositiveButton(“确定”,
新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//TODO自动生成的方法存根
dialog.cancel();
}
});
AlertDialog alert=builder.create();
alert.show();
}
}
私有布尔值有效(整数分数){

如果(分数>=0&&score学习如何从Logcat读取堆栈跟踪:

  • logcat中的这一行:

    Caused by: java.lang.ClassCastException: android.widget.LinearLayout`
    
    告诉您应用程序中的异常

  • 另一行:

    at com.Elson.ProjectVersion.EnterScoresActivity.setUpViews(EnterScoresActivity.java:142)
    
    告诉您异常发生的位置以及应该在哪里进行修复

以这些信息为背景,让我们在EnterScoresActivity.java中查找第142行。由于您复制/粘贴了整个类,因此很容易找到罪魁祸首,结果是这一行:

saveButton= (Button) findViewById(R.id.SaveButton);
似乎id为
SaveButton
的元素是一个
线性布局
,您正在尝试对
按钮进行强制转换。为了确保这一点,让我们检查您的视图xml并搜索id为
SaveButton
的元素。从问题中的xml中,我们将发现:

<LinearLayout
    android:id="@+id/SaveButton"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

这就是问题所在:此
LinearLayout
的id是
SaveButton
,这可能是您在编辑视图时犯的错误

解决方案

可能的解决方案是将
SaveButton
id设置为相应的按钮,而不是代码中的此
LinearLayout

<LinearLayout
    android:id="@+id/SaveButton"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical" >
....
<Button
    android:id="@+id/SaveButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save"
    tools:ignore="DuplicateIds" />

....

您可以看到按钮和线性布局都具有相同的id值…只要尝试更改不同的id值并尝试一下即可

事后诸葛亮:如果您是java新手,请不要进入android。此外,我认为
…EnterScoresActivity.java:142)
是一个相关的行。请查看该文件中的第142行,并检查是否有错误的强制转换。(您可能需要谷歌强制转换和
ClassCastException
)提供解决方案而不是让某人沮丧,每个人都会在某一天迈出第一步。哇。这真的解释得很好。即使像我这样的初学者也能理解哈哈。非常感谢你的帮助。这很有效。这是一个学校项目,所以是的。我没有太多的选择。不过从零开始学习很有趣!再次感谢…你我真的救了我的命哈哈!
<LinearLayout
    android:id="@+id/SaveButton"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical" >
<LinearLayout
    android:id="@+id/SaveButton"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical" >
....
<Button
    android:id="@+id/SaveButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Save"
    tools:ignore="DuplicateIds" />