VirtualBox API Exception

187
27 сентября 2017, 09:06

Доброе время суток. Задача следующая, поднять, используя API Java, виртуальную машину и запустить на ней любую элементарную программу. В дальнейшем создать листенера и прослушать порт, получить вывод с виртуалки в констоль(эта часть пока не реализована). Код 1й части готов, но получаю NullPointerException 21 и 89 строка. Работаю с подобной вещью 1й раз, поэтому по возможности, напишите расширеное объяснение. Спасибо.

import org.virtualbox_5_1.*;
import org.virtualbox_5_1.ISession;
import org.virtualbox_5_1.IProgress;
import java.util.List;
import java.util.Arrays;
public class Events_5_1 {
    static VirtualBoxManager mgr;
    static Thread listener;
    public static void main(String[] args) {
        String vmName = Long.toString(System.currentTimeMillis()); // Берем рандомное значение имени VirtualMachine
        System.out.println("Creating VirtualBox instance");
        mgr = VirtualBoxManager.createInstance(null);
        try {
            listener = new EventWorker();
            listener.start();
            try {
                //Создаем пустую машину и сохраняем на диск
                IMachine vm = mgr.getVBox().createMachine(null, vmName, null, "Other", null);//тестить , разобраться с параметрами
                vm.saveSettings();
                mgr.getVBox().registerMachine(vm);
                vm = mgr.getVBox().findMachine(vmName);
                ISession session = mgr.getSessionObject();
                IProgress p = vm.launchVMProcess(session, "headless", null); // Вместо headless - ставим процесс ??
                p.waitForCompletion(-1);
                try {
                    if (p.getResultCode() != 0) {
                        throw new RuntimeException(p.getErrorInfo().getText());
                    } else {
                        p = session.getConsole().powerDown();
                        p.waitForCompletion(-1);
                        if (p.getResultCode() != 0) {
                            throw new RuntimeException(p.getErrorInfo().getText());
                        } else {
                        }
                    }
                } finally {
                    session.unlockMachine();
                    while (!SessionState.Unlocked.equals(vm.getSessionState())) {
                        try {
                            System.out.println("Waiting for session unlocked");
                            Thread.sleep(1000L);
                        } catch (InterruptedException e) {
                            System.err.println("Interrupted while vaiting for session unlocked");
                        }
                    }
                    System.out.println("Deleting machine");
                    vm.deleteConfig(vm.unregister(CleanupMode.DetachAllReturnHardDisksOnly));
                }
            } finally {
                listener.interrupt();
                try {
                    listener.join(5000);
                } catch (InterruptedException e) {
                    System.err.println("Inerrupted while vaiting for EventWorker stop");
                }
                if (listener.isAlive()) {
                    System.err.println("Event worked did not stop in a timely fashion");
                } else {
                    System.out.println("event worker stoped");
                }
            }
        } finally {
            mgr.disconnect();
            mgr.cleanup();
            System.out.println("Disconecting from VirtualBox");
        }

    }
    static class EventWorker extends Thread {
        IEventListener el;
        @Override
        public void run() {
            System.out.println("EventWorker started");
            el = mgr.getVBox().getEventSource().createListener();
            //TODO: connect gradle, mvnrepository.com idea connect datasource postgre
            List<VBoxEventType> types = Arrays.asList(VBoxEventType.OnSessionStateChanged, VBoxEventType.OnMachineStateChanged,
                    VBoxEventType.OnMachineRegistered);
            mgr.getVBox().getEventSource().registerListener(el, types, false);
            try{
                while(!isInterrupted()){
                    mgr.waitForEvents(0);
                    IEvent rawEvent = mgr.getVBox().getEventSource().getEvent(el , 1000);
                    if(rawEvent==null) continue;
                    try{
                        System.out.println("Got event type "+rawEvent.getType());
                        if(VBoxEventType.OnSessionStateChanged.equals(rawEvent.getType())){
                            ISessionStateChangedEvent event = ISessionStateChangedEvent.queryInterface(rawEvent);
                            System.out.println("Machine "+event.getState()+" for machine "+event.getMachineId());
                        }
                        if(VBoxEventType.OnMachineRegistered.equals((rawEvent.getType()))){
                            IMachineRegisteredEvent event = IMachineRegisteredEvent.queryInterface(rawEvent);
                            System.out.println("Machine "+event.getMachineId()+" has been "+(event.getRegistered() ? "registered":"unregistered"));
                        }
                        if(VBoxEventType.OnMachineStateChanged.equals(rawEvent.getType())){
                            IMachineStateChangedEvent event = IMachineStateChangedEvent.queryInterface(rawEvent);
                            System.out.println("Machine "+event.getMachineId()+" state changed to "+event.getState());
                        }
                    }finally {
                        mgr.getVBox().getEventSource().eventProcessed(el,rawEvent);
                    }
                }
            }catch(Throwable t){
                t.printStackTrace();
            }finally {
                mgr.getVBox().getEventSource().unregisterListener(el);
                System.out.println("EventWorker finished");
            }
        }
    }
}
Answer 1

У вас проваливается создание инстанса виртуальной машины, строка:

VirtualBoxManager.createInstance(null);

подозреваю, что Oracle VirtualBox не установлен в системе

READ ALSO
NullPointerException at LoadedApk.getAssets

NullPointerException at LoadedApk.getAssets

Через Developer Console получил известие о такой ошибкеС чем она может быть связана? Не дубликат вопроса о NullPointerException в общем смысле

284
Как складывать время на Android?

Как складывать время на Android?

Как программно посчитать времяНеобходимо время с TextClock прибавить 20 мин которое записано в TextView В TextView время может менять 20, 40, 110, 180 и т

234
JavaFX. Как получить элемент по нажатию

JavaFX. Как получить элемент по нажатию

Есть TabPane, в нем создаются Tab, в Tab помещается TextAreaЕсть Button, который что-то должен делать с открытым TextArea в Tab

350
Почему не инкрементируются значения?

Почему не инкрементируются значения?

Как я понял, создается 4 нити, и каждая из них должна увеличивать на 1 каждый элемент массива valuesНо этого не происходит

249