尝试保存时出现空指针异常

时间:2020-11-01 09:29:29

标签: android-studio nullpointerexception

    mSaveAircraftButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Aircraft aircraft = new Aircraft();

            aircraft.setAircraftId(mEditSn.getText().toString());
            aircraft.setBoecg(Float.parseFloat(mEditBOECG.getText().toString()));
            aircraft.setBoew(Float.parseFloat(mEditBOEW.getText().toString()));
           aircraft.setCycles(Integer.parseInt(mEditCycles.getText().toString()));
            aircraft.setDatum(Float.parseFloat(mEditDatum.getText().toString()));
            aircraft.setAircraftType(mEditAt.getText().toString());
            aircraft.setHobbs(Float.parseFloat(mEditHobbs.getText().toString()));
            aircraft.setEngineLocation(Integer.parseInt(mEditEngLoc.getText().toString()));
            aircraft.setMlw(Integer.parseInt(mEditMLW.getText().toString()));
            aircraft.setMrw(Integer.parseInt(mEditMRW.getText().toString()));
            aircraft.setMtow(Integer.parseInt(mEditMTOW.getText().toString()));
            aircraft.setMzfw(Integer.parseInt(mEditMZFW.getText().toString()));
            mAircraftViewModel.insert();

            Toast.makeText(mContext, "Aircraft added to Database", Toast.LENGTH_LONG).show();
            Log.w("Tatenda","Added Aircraft Name");
          //  mAircraft.getAircraftType(mEditAt.getText().toString());
        }
    });
package com.example.mafv5;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Database(entities = {Aircraft.class,FuelTank.class, Performance.class, PaxZone.class, CargoZone.class, }, version = 1, exportSchema = false)
public abstract class MafRoomDatabase extends RoomDatabase {

    public static final int FLIGHT_PLAN_VM = 1;

    public MafRoomDatabase(AircraftActivity aircraftActivity) {

    }

    public abstract AircraftDao aircraftDao();

    public abstract FuelTankDao fuelTankDao();

    public abstract PerformanceDao performanceDao();

    public abstract PaxZoneDao paxZoneDao();

    public abstract CargoZoneDao cargoZoneDao();
    // public abstract AirportDao airportDao();
    //   public abstract FlightPlanDao flightPlanDao();
    //  public abstract PersonDao personDao();
    //   public abstract PaxFlightRequest paxFlightRequestDao();
    //  public abstract BaggageDao baggageDao();
    //  public abstract PilotDao pilotDao();
    //   public abstract PrePostFlightDao prePostFlightDao();


    public MafRoomDatabase() {
    }

    //this will be set by keaton when he updates: almost assuredly on a non UI thread
    public static volatile boolean[] isInvalid;

    private static boolean[] isLive;

    private static final int NUM_VIEW_MODELS = 10;

    public static final int AIRCRAFT_VM = 0;

    // marking the instance as volatile to ensure atomic access to the variable
    private static volatile MafRoomDatabase INSTANCE;
    private static final int NUMBER_OF_THREADS = 4;
    static final ExecutorService databaseWriteExecutor =
            Executors.newFixedThreadPool(NUMBER_OF_THREADS);

    public static MafRoomDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (MafRoomDatabase.class) {
                if (INSTANCE == null) {
                    Callback sRoomDatabase = null;
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(), MafRoomDatabase.class, "aircraft_database").
                            addCallback(sRoomDatabase)
                            .allowMainThreadQueries()
                            .build();

                    isLive = new boolean[NUM_VIEW_MODELS];
                    isInvalid = new boolean[NUM_VIEW_MODELS];
                }
            }
        }
        return INSTANCE;
    }

    private static MafRoomDatabase.Callback sRoomDatabaseCallback = new MafRoomDatabase.Callback() {
        @Override
        public void onOpen(@NonNull SupportSQLiteDatabase db) {
            super.onOpen(db);
        }
    };

    public static boolean isLive(int viewModel) {
        boolean rc = false;
        if (viewModel < NUM_VIEW_MODELS) {
            rc = isLive[viewModel];
        }
        return rc;
    }

    public static boolean isInvalid(int viewModel) {
        boolean rc = false;
        if (viewModel < NUM_VIEW_MODELS) {
            rc = isInvalid[viewModel];
        }
        return rc;
    }

    public static void setIsLive(int viewModel, boolean isLive) {
        if (viewModel < NUM_VIEW_MODELS) {
            MafRoomDatabase.isLive[viewModel] = isLive;
        }
    }

    public static void setIsInvalid(int viewModel, boolean isInvalid) {
        if (viewModel < NUM_VIEW_MODELS) {
            MafRoomDatabase.isInvalid[viewModel] = isInvalid;
        }
    }

    //set all live viewmodels to invalid viewmodels by copying isLive[] into isInvalid[]
    public static void setAllInvalid() {
        System.arraycopy(isLive, 0, isInvalid, 0, NUM_VIEW_MODELS);
    }
}
 
`

public class AircraftRepository {
    private AircraftDao mAircraftDao;

private FuelTankDao mFuelTankDao;
private PaxZoneDao mPaxZoneDao;
private CargoZoneDao mCargoZoneDao;
private PerformanceDao mPerformanceDao;
    private Aircraft mAircraft;
private FuelTank mFuelTank;
private CargoZone mCargoZone;
private PaxZone mPaxZone;
//private List<PaxZoneList> mPaxZoneList;
//private List<CargoZoneList> mCargoZoneList;
//private List<AircraftList> mAircraftList;
    public AircraftRepository(Application application) {
        MafRoomDatabase db = MafRoomDatabase.getDatabase(application);
        mAircraftDao = db.aircraftDao();
        mFuelTankDao = db.fuelTankDao();
        mPaxZoneDao = db.paxZoneDao();
        mCargoZoneDao = db.cargoZoneDao();
        mPerformanceDao = db.performanceDao();
    }

    public void sync(final AircraftActivityCallback aircraftActivityCallback,
                     final AircraftViewModelCallback aircraftViewModelCallback, final String aircraftId) {
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mAircraft = mAircraftDao.selectAircraftById(aircraftId);
                mFuelTank = mAircraftDao.selectFuelTankById(aircraftId);
          //  mCargoZone.setCargoZoneId(cargoId);
                aircraftViewModelCallback.aircraftViewModelCallback(aircraftActivityCallback, mAircraft);

                if (mAircraft!= null) {
                    if (mAircraft.getAircraftId() != null) {
                        mAircraft = mAircraftDao.selectAircraftById(mAircraft.getAircraftId());

                    }
                    if (mAircraft !=null){
                        mFuelTank = mFuelTankDao.selectFuelTankById(mFuelTank.getFuelTankId());
                       // mAircraft = mAircraftDao.selectCargoZoneById(Integer.parseInt(mAircraft.getAircraftId()));
                    }
                   // if(mAircraft.getPaxZoneId()!= null){
                     //   mPaxZone = mAircraftDao.selectPaxZoneById(mAircraft.)
                    //}
                }
            }
        });
    }
public void insert(final AircraftActivityCallback aircraftActivityCallback,
                   final Aircraft aircraft,
                   final CargoZone cargoZone,
                   final PaxZone paxZone,
                   final FuelTank fuelTank,
                   final Performance performance){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {

            }
        });
}
    public void insert(final Aircraft aircraft) {
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mAircraftDao.insert(aircraft);
            }
        });
    }
    public void insert(final FuelTank fuelTank){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mFuelTankDao.insert(fuelTank);
            }
        });
    }
    public void insert(final PaxZone paxZone){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mPaxZoneDao.insert(paxZone);
            }
        });
    }
    public void insert (final CargoZone cargoZone){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mCargoZoneDao.insert(cargoZone);
            }
        });
    }

    public void insert(final Performance performance){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mPerformanceDao.insert(performance);

            }
        });
    }
    public void insertPerformanceList(final List<Performance> performanceList) {
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < performanceList.size(); i++) {
                    mAircraftDao.insert(performanceList.get(i));
                }
            }
        });
    }

    public void update(final Aircraft aircraft) {
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mAircraftDao.update(aircraft);
            }
        });
    }
public void update(final FuelTank fuelTank){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mFuelTankDao.update(fuelTank);
            }
        });
}

public void update(final PaxZone paxZone){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mPaxZoneDao.update(paxZone);
            }
        });
}

public void update(final CargoZone cargoZone){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mCargoZoneDao.update(cargoZone);
            }
        });
}

public void update(final Performance performance){
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mPerformanceDao.update(performance);
            }
        });
}


    public void deleteAll() {
        MafRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                mAircraftDao.deleteAll();
                mPerformanceDao.deleteAll();
                mCargoZoneDao.deleteAll();
            }
        });
    }
}

`
package com.example.mafv5;

import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;


@Dao
public interface AircraftDao {

    @Query("DELETE FROM aircraft")
    void deleteAll();

    @Insert
    void insert(Aircraft aircraft);

    @Insert
    long insert(Performance performance);

    @Insert
    long insert(PaxZone paxZone);

    @Insert
    long insert(CargoZone cargoZone);

    @Insert
    long insert(FuelTank fuelTank);

    @Update
    void update(Aircraft aircraft);


    @Update
    void update(Performance performance);

    @Update
    void update(PaxZone paxZone);

    @Update
    void update(CargoZone cargoZone);

    @Update
    void update(FuelTank fuelTank);



    //@Update(entity = Aircraft.class)
 //   void update(FlightPlanUpdateIsCancelled flightPlanUpdateIsCancelled);



    @Query("SELECT * FROM aircraft WHERE aircraft_id=:aircraftId")
    Aircraft selectAircraftById(String aircraftId);

    @Query("SELECT * FROM fuel_tank WHERE aircraft_id=:aircraftId")
    FuelTank selectFuelTankById(String aircraftId);

    @Query("SELECT * FROM cargo_zone WHERE cargo_zone_id=:cargoZoneId")
    CargoZone selectCargoZoneById(int cargoZoneId);

    @Query("SELECT * FROM pax_zone WHERE pax_zone_id=:paxZoneId")
    PaxZone selectPaxZoneById(int paxZoneId);

    @Query("SELECT * FROM performance WHERE performance_id=:performanceZoneId")
    Performance selectPerformanceById(int performanceZoneId);
}
`

错误:

2020-11-01 03:02:58.401 7611-7665 / com.example.mafv5 E / AndroidRuntime:FATAL EXCEPTION:pool-2-thread-1 流程:com.example.mafv5,PID:7611 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void androidx.room.RoomDatabase $ Callback.onCreate(androidx.sqlite.db.SupportSQLiteDatabase)' 在com.example.mafv5.MafRoomDatabase_Impl $ 1.onCreate(MafRoomDatabase_Impl.java:76) 在androidx.room.RoomOpenHelper.onCreate(RoomOpenHelper.java:87) 在androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper $ OpenHelper.onCreate(FrameworkSQLiteOpenHelper.java:118) 在android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:411) 在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:316) 在androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper $ OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:92) 在androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:53) 在androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476) 在androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:281) 在com.example.mafv5.AircraftDao_Impl.insert(AircraftDao_Impl.java:612) 在com.example.mafv5.AircraftRepository $ 3.run(AircraftRepository.java:73) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:641) 在java.lang.Thread.run(Thread.java:923)

0 个答案:

没有答案