2013-03-11 80 views
1

我正在编写一个应用程序,当我尝试通过按下主菜单上的按钮加载类/布局时,出现以下logcat错误,我不知道它们的意思,谁能告诉我我为什么我的应用程序崩溃?媒体播放器示例应用程序崩溃

03-11 16:40:06.955: E/AndroidRuntime(18456): FATAL EXCEPTION: main 
03-11 16:40:06.955: E/AndroidRuntime(18456): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.famouspeople/com.example.famouspeople.Music}: java.lang.InstantiationException: can't instantiate class com.example.famouspeople.Music; no empty constructor 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2024) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.os.Looper.loop(Looper.java:137) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.app.ActivityThread.main(ActivityThread.java:4898) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at java.lang.reflect.Method.invokeNative(Native Method) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at java.lang.reflect.Method.invoke(Method.java:511) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at dalvik.system.NativeStart.main(Native Method) 
03-11 16:40:06.955: E/AndroidRuntime(18456): Caused by: java.lang.InstantiationException: can't instantiate class com.example.famouspeople.Music; no empty constructor 
03-11 16:40:06.955: E/AndroidRuntime(18456): at java.lang.Class.newInstanceImpl(Native Method) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at java.lang.Class.newInstance(Class.java:1319) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.app.Instrumentation.newActivity(Instrumentation.java:1057) 
03-11 16:40:06.955: E/AndroidRuntime(18456): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015) 
03-11 16:40:06.955: E/AndroidRuntime(18456): ... 11 more 
03-11 16:40:16.560: I/Process(18456): Sending signal. PID: 18456 SIG: 9 

代码:

public class Music implements OnCompletionListener{ 
MediaPlayer mediaPlayer; 
boolean isPrepared = false; 

public Music(AssetFileDescriptor assetDescriptor){ 
    mediaPlayer = new MediaPlayer(); 
    try{ 
     mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(), assetDescriptor.getStartOffset(), assetDescriptor.getLength()); 
     mediaPlayer.prepare(); 
     isPrepared = true; 
     mediaPlayer.setOnCompletionListener(this); 
    } catch(Exception ex){ 
     throw new RuntimeException("Couldn't load music, uh oh!"); 
    } 
} 

public Music(FileDescriptor fileDescriptor){ 
    mediaPlayer = new MediaPlayer(); 
    try{ 
     mediaPlayer.setDataSource(fileDescriptor); 
     mediaPlayer.prepare(); 
     isPrepared = true; 
     mediaPlayer.setOnCompletionListener(this); 
    } catch(Exception ex){ 
     throw new RuntimeException("Couldn't load music, uh oh!"); 
    } 
} 

public void onCompletion(MediaPlayer mediaPlayer) { 
    synchronized(this){ 
     isPrepared = false; 
    } 
} 

public void play() { 
    if(mediaPlayer.isPlaying()){ 
     return; 
    } 
    try{ 
     synchronized(this){ 
      if(!isPrepared){ 
       mediaPlayer.prepare(); 
      } 
      mediaPlayer.start(); 
     } 
    } catch(IllegalStateException ex){ 
     ex.printStackTrace(); 
    } catch(IOException ex){ 
     ex.printStackTrace(); 
    } 
} 

public void stop() { 
    mediaPlayer.stop(); 
    synchronized(this){ 
     isPrepared = false; 
    } 
} 

public void switchTracks(){ 
    mediaPlayer.seekTo(0); 
    mediaPlayer.pause(); 
} 

public void pause() { 
    mediaPlayer.pause(); 
} 

public boolean isPlaying() { 
    return mediaPlayer.isPlaying(); 
} 

public boolean isLooping() { 
    return mediaPlayer.isLooping(); 
} 

public void setLooping(boolean isLooping) { 
    mediaPlayer.setLooping(isLooping); 
} 

public void setVolume(float volumeLeft, float volumeRight) { 
    mediaPlayer.setVolume(volumeLeft, volumeRight); 
} 

public void dispose() { 
    if(mediaPlayer.isPlaying()){ 
     stop(); 
    } 
    mediaPlayer.release(); 
} 

}

+0

1)这对您没有帮助吗? *'不能实例化类com.example.famouspeople.Music;没有空的构造函数* 2)如果你仍然无法弄清楚,请添加你的代码。 – 2013-03-11 16:43:23

+0

你不知道'没有空的构造函数'是什么意思? – njzk2 2013-03-11 16:43:36

+1

@ njzk2我没有,我只用了一周的时间学习了java,使用了教程。 – Thomas 2013-03-11 16:45:58

回答

2

您需要定义无参数的构造函数,否则系统不知道如何进行实例化。 Dalvik VM寻找一个零参数的构造函数。如果您在服务中定义一个参数或多个参数。

public Music() { 
    .... 
} 
0

的Android仪器试图创建的com.example.famouspeople.Music一个实例,并为它需要一个默认构造函数。这就是它失败的原因。在Music类中创建默认构造函数public com.example.famouspeople.Music(){}可能会有所帮助。

public class Music implements OnCompletionListener{ 
    public Music() 
    { 
    } 
    public boolean setFileDescriptor(FileDescriptor fileDescriptor){ 
    //set file descriptor for the current instance 
    } 
    public boolean init(){ 
    //do initialisation of player 
    } 
} 

设置文件描述符后调用init()。但是整个命名约定似乎让你的包/类感到困惑。