为什么我用io.datafx得到java.lang.NullPointerException?

时间:2016-09-28 10:59:34

标签: java maven javafx fxml

我发现了JAVAFX,我实现了对项目结构的重构 经过1个小时,也许这是愚蠢的,但我真的不明白这个问题。 它在重构名称和包文件之前有效。 我的项目现在在maven下(我不知道这是否有所改变) 这是我的错误:

public static async Task CheckSite(string url, int id)
{
    try
    {
        using(var db = new PlaceDBContext())
        using (HttpClient client = new HttpClient(new HttpClientHandler()
        {
            AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
        }))
        using (HttpResponseMessage response = await client.GetAsync(url))
        using (HttpContent content = response.Content)
        {
            client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
            client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
            client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
            client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");

            var rd = db.RootDomains.Find(id);
            string result = await content.ReadAsStringAsync();


            if (result != null && result.Length >= 50)
            {
                Console.WriteLine("fine");
                rd.LastCheckOnline = true;
            }
            else
            {
                Console.WriteLine("There was empty or short result");
                rd.LastCheckOnline = false;
            }
            db.SaveChanges();
            semaphore.Release();
        }
    }
    catch(Exception ex)
    {

        Console.WriteLine(ex.Message);
        using(var db = new PlaceDBContext())
        {
            var rd = db.RootDomains.Find(id);
            rd.LastCheckOnline = false;
            db.SaveChanges();
            semaphore.Release();
        }
    }

}

这是我的sidebarMenuController.java:

GRAVE: null
io.datafx.controller.flow.FlowException: io.datafx.controller.FxmlLoadException: java.lang.reflect.InvocationTargetException
    at io.datafx.controller.flow.FlowHandler.start(FlowHandler.java:143)
    at io.datafx.controller.flow.FlowHandler.start(FlowHandler.java:101)
    at maxiRename.controller.MainController.initialize(MainController.java:88)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
    at io.datafx.controller.ViewFactory.createByController(ViewFactory.java:161)
    at io.datafx.controller.flow.FlowHandler.start(FlowHandler.java:140)
    at maxiRenameApp.MainMaxiFilm.start(MainMaxiFilm.java:27)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Caused by: io.datafx.controller.FxmlLoadException: java.lang.reflect.InvocationTargetException
    at io.datafx.controller.ViewFactory.createByController(ViewFactory.java:180)
    at io.datafx.controller.flow.FlowHandler.start(FlowHandler.java:140)
    ... 17 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at io.datafx.controller.ViewFactory.createByController(ViewFactory.java:175)
    ... 18 more
Caused by: java.lang.NullPointerException
    at maxiRename.controller.SideMenuController.init(SideMenuController.java:65)
    ... 23 more

我的结构文件,如果它可以帮助您: Structure project

我的第一个想法是在一条糟糕的道路上或类似的东西但是如果我改变它我会得到错误'没有设置位置'所以我想我的道路很好。

package maxiRename.controller;

import javax.annotation.PostConstruct;

import com.jfoenix.controls.JFXListView;

import io.datafx.controller.FXMLController;
import io.datafx.controller.flow.Flow;
import io.datafx.controller.flow.FlowException;
import io.datafx.controller.flow.FlowHandler;
import io.datafx.controller.flow.context.FXMLViewFlowContext;
import io.datafx.controller.flow.context.ViewFlowContext;
import io.datafx.controller.util.VetoException;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;

@FXMLController(value = "/maxiRename/view/SideMenu.fxml", title = "Material Design Example")
public class SideMenuController {


    @FXML
    private StackPane root;

    @FXML
    private VBox listViewDrawer;

    @FXML
    private ImageView imageTopDrawer;

    @FXML
    private JFXListView<?> list1;

    @FXML
    private Label home;

    @FXML
    private JFXListView<?> subList;

    @FXML
    private Label musics;

    @FXML
    private Label movies;

    @FXML
    private Label series;

    @FXML
    private Label help;

    @FXML
    private Label exit;

    @FXMLViewFlowContext
    private ViewFlowContext context;

    @PostConstruct
    public void init() throws FlowException, VetoException {
        list1.propagateMouseEventsToParent();
        System.out.println(context);
        FlowHandler contentFlowHandler = (FlowHandler) context.getRegisteredObject("ContentFlowHandler");
        Flow contentFlow = (Flow) context.getRegisteredObject("ContentFlow");
        System.out.println(subList.getItems().get(0));
        bindNodeToController(home, HomeController.class, contentFlow, contentFlowHandler);
        bindNodeToController(musics, MusicsSettingsController.class, contentFlow, contentFlowHandler);
        bindNodeToController(movies, MoviesSettingsController.class, contentFlow, contentFlowHandler);
        bindNodeToController(series, SeriesSettingsController.class, contentFlow, contentFlowHandler);
        bindNodeToController(help, HelpController.class, contentFlow, contentFlowHandler);
    }

    private void bindNodeToController(Node node, Class<?> controllerClass, Flow flow, FlowHandler flowHandler) {
        flow.withGlobalLink(node.getId(), controllerClass);
        node.setOnMouseClicked((e) -> {
            try {               
                flowHandler.handle(node.getId());               
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        });
    }
}

编辑:maxiRename.controller.SideMenuController.init(SideMenuController.java:65)是:

@FXMLController(value = "/maxiRename/view/SideMenu.fxml", title = "Material Design Example")

1 个答案:

答案 0 :(得分:0)

好的,我找到了它!

这是名为'flow'的库。在8.0版本中,它可以工作,但不能在8.1版本中使用。

从maven我有这个:

import React from 'react'
import io from 'socket.io-client'

class App extends React.Component {
    constructor() {
        super();
        this.state = {messages: [], value: ''}
        this.handle = this.handle.bind(this)
        this.submit = this.submit.bind(this)
    }

    componentDidMount() {
        this.socket = io('/')
        this.socket.on('message', data => {
                this.setState({messages:[...this.state.messages, data], value: ''})
                console.log(data);
            })  
    }

    handle(e) {
        this.setState({value: e.target.value})
    }

    submit() {
        if(this.state.value.length!==0) 
            {
                this.socket.emit('message', this.state.value)       
            } 
        console.log(this.state.messages);
    }



    render() {
        let messages = this.state.messages.map((e, i) => <li key={i}>{e}</li>)
            return (<div>
                        <input id='input' onChange = {this.handle} value = {this.state.value}/>
                            <button onClick={this.submit}>Submit!</button>
                                <ul>
                                    {messages}
                                </ul>
                        </div>);
        }
    }

export default App

现在我有了这个:

<dependency>
    <groupId>io.datafx</groupId>
    <artifactId>flow</artifactId>
    <version>8.1</version>
</dependency>

谢谢,我希望这对其他人有用;)