最近在学服务组件的时候写的一个银行项目,在存款的时候报了空指针异常和反射异常,应该怎么解决?
1.MainActivity代码
package com.example.banktestdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void NormalUserClick(View view){
Log.d(TAG,"点击用户按钮");
startActivity(new Intent(this,NormalUserActivity.class));
}
public void BankWorkerClick(View view){
startActivity(new Intent(this,BankWorkerActivity.class));
}
public void BossClick(View view){
startActivity(new Intent(this,BankBossActivity.class));
}
}
2.NormalUserAction_impl代码(实现类)
package com.example.banktestdemo.impl;
import android.os.Binder;
import android.util.Log;
import com.example.banktestdemo.Interfaces.INormalUserAction;
public class NormalUserAction extends Binder implements INormalUserAction {
//这里要继承binder
private static final String TAG = "NormalUserAction";
@Override
public void savemoney(float money) {
Log.d(TAG, "savemoney is ---" + money);
}
@Override
public float getmoney() {
Log.d(TAG, "getmoney is ---100.00");
return 100.00f;
}
@Override
public float loanmoney() {
Log.d(TAG, "loanmoney is 100.00");
return 100.00f;
}
}
3.NormalUser的接口代码
ackage com.example.banktestdemo.Interfaces;
public interface INormalUserAction {
void savemoney(float money);
float getmoney();
float loanmoney();
}
4.NormalUserActivity代码
package com.example.banktestdemo;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
import com.example.banktestdemo.Interfaces.INormalUserAction;
public class NormalUserActivity extends Activity {
private static final String TAG = "NormalUserActivity";
private NormalUserConnection mnormalUserConnection;
private boolean mIsBind;
private INormalUserAction mnormalUserAction;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
doBindService();//写一个绑定服务的方法
}
private void doBindService() {
Log.d(TAG,"执行doBindService");
Intent intent =new Intent();
intent.setAction("com.example.ACTION_NORMAL_USER");
intent.addCategory(Intent.CATEGORY_DEFAULT);//理解这步
intent.setPackage(this.getPackageName());//必须声明包名,否则会报错
mnormalUserConnection = new NormalUserConnection();
mIsBind = bindService(intent, mnormalUserConnection, BIND_AUTO_CREATE);
}
private class NormalUserConnection implements ServiceConnection {
private INormalUserAction mnormalUserAction;
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通过接口来转换,等于这个方法里面的IBinder 的service;这样写就能获取对方的控制权
Log.d(TAG,"Service connected"+name);
mnormalUserAction = (INormalUserAction) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG,"Service disconnected"+name);
}
}
public void saveClick(View view){
Log.d(TAG,"savemoney");
mnormalUserAction.savemoney(100000);//走到这一步开始出错,反射异常和空指针异常
}
public void getClick(View view){
Log.d(TAG,"get money");
mnormalUserAction.getmoney();
}
public void loanClick(View view){
Log.d(TAG,"loan money");
mnormalUserAction.loanmoney();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mIsBind&&mnormalUserConnection!=null){
unbindService(mnormalUserConnection);
mnormalUserConnection = null;
mIsBind = false;
}
}
}
5.BankService代码
package com.example.banktestdemo;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import com.example.banktestdemo.Interfaces.INormalUserAction;
import com.example.banktestdemo.impl.BankBossAction;
import com.example.banktestdemo.impl.BankWorkerAction;
import com.example.banktestdemo.impl.NormalUserAction;
public class BankServices extends Service {
private static final String TAG = "BankServices";
@Nullable
@Override
public IBinder onBind(Intent intent) {
String action = intent.getAction();
if (!TextUtils.isEmpty(action)){
Log.d(TAG,"进行回调");
if ("com.example.ACTION_NORMAL_USER".equals(action)) {
Log.d(TAG,"符合用户Action");
return new NormalUserAction();
}else if ("com.example.ACTION_BANK_WORKER".equals(action)){
return new BankWorkerAction();
}else if ("com.example.ACTION_BANK_BOSS".equals(action)){
return new BankBossAction();
}
}
Log.d(TAG, "走到这里");
return new NormalUserAction();
}
}
6.log报错部分
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.banktestdemo, PID: 6127
java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:4020)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4015)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.banktestdemo.Interfaces.INormalUserAction.savemoney(float)' on a null object reference
at com.example.banktestdemo.NormalUserActivity.saveClick(NormalUserActivity.java:60)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4015)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
问题已解决,我把通过用boole类型强转NormalUser接口类型的方法改为把UserAction new出来再调用,程序通过.
空指针很好解决,com.example.banktestdemo.Interfaces.INormalUserAction.savemoney(float)' on a null object reference
at com.example.banktestdemo.NormalUserActivity.saveClick(NormalUserActivity.java:60)
60行有问题。