Diskuze: java.lang.NullPointerException
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Petr Štechmüller:8.12.2015 20:34
Ahoj, asi by bylo lepší sem poslat celý kód té vyjímky, Ten nám řekne víc...
Tomáš Brůna:8.12.2015 20:36
promiň, mám poslat můj kód nebo celý kód co jí vyvolává?
Petr Štechmüller:8.12.2015 20:38
Pošli obsah vyjímky. Když se ta vyjímka stane, tak se do konzole vypíše hromada textu. Tak tu hromadu textu nám sem překopíruj...
Tomáš Brůna:8.12.2015 20:41
tohle?
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1762)
at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1645)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Node.fireEvent(Node.java:8216)
at javafx.scene.control.Button.fire(Button.java:185)
at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3724)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382)
at com.sun.glass.ui.View.handleMouseEvent(View.java:553)
at com.sun.glass.ui.View.notifyMouse(View.java:925)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
at com.sun.glass.ui.win.WinApplication$$Lambda$38/29531133.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
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:483)
at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1757)
... 47 more
Caused by: java.lang.NullPointerException
at screeny02.FXMLDocumentController.handleButtonAction(FXMLDocumentController.java:59)
... 57 more
Jo přesně tohle. Zde se píše, kde je chyba.
at screeny02.FXMLDocumentController.handleButtonAction(FXMLDocumentController.java:59)
Co máš na řádku 59 ve FXMLDocumentController?
Tomáš Brůna:8.12.2015 20:49
tohleto
if (ImageHeight.getText() != null && Integer.parseInt(ImageHeight.getText()) != 0)
Tak to vypadá, že ImageHeight není inicializovaný. Je to null. Proto ten NullPointerException. Tak nám asi ukaž více kódu, ať zjistímě, proč to nemáš inicializovaný...
FXMLDocumentController
public class FXMLDocumentController implements Initializable {
@FXML
private TextField DefaultPathField; // cesta ke složce s obrázky
@FXML
private CheckBox NewPhoto; // kontroluje zda má při vyfocení vytvořít nový obrázek
@FXML
private CheckBox MySize;
@FXML
private TextField ImageHeight;
@FXML
private TextField ImageWidth;
private int index;
private int Height;
private int Width;
@FXML
private void handleButtonAction(ActionEvent event) throws AWTException, IOException { // tlačítko pro screenshot
Camera cam = new Camera(index);
if (NewPhoto.isSelected())
{ index++; }
if (MySize.isSelected())
{
if (ImageHeight.getText() != null && Integer.parseInt(ImageHeight.getText()) != 0)
{
if (ImageWidth.getText() != null && Integer.parseInt(ImageWidth.getText()) != 0)
{
this.Height = Integer.parseInt(ImageHeight.getText());
this.Width = Integer.parseInt(ImageWidth.getText());
}
}
else
{
this.Height = 30;
this.Width = 30;
}
cam.TakePhoto(DefaultPathField.getText(), NewPhoto.isSelected(), MySize.isSelected(), this.Height, this.Width);
}}
@Override
public void initialize(URL url, ResourceBundle rb) {
index = 0;
// cyklus kontroluje, kolik obrázků je již vytvořeno, potřeba dodělat aby projel jenom tolik obrátků, kolik je ve složce
for (int i = 0; i < 80; i++)
{
File screenshot = new File(System.getenv("APPDATA") + File.separator + "\\Screenovac\\" +"screenshot" + String.valueOf(i) + ".png");
if (screenshot.exists() == true)
{
index++;
}
}
generujcestu(); // vygeneruje složku v AppData a zapíše její cestu do souboru cesta.txt
try {
nactiCestu("C:\\Users\\asus\\Documents\\NetBeansProjects\\Screeny02\\src\\screeny02\\cesta.txt"); // načte cestu ze souboru cesta.txt
} catch (FileNotFoundException ex) {}
}
fxml soubor
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.effect.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="165.0" prefWidth="332.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="screeny02.FXMLDocumentController">
<children>
<Button fx:id="button" layoutX="143.0" layoutY="126.0" onAction="#handleButtonAction" text="Vyfoť" />
<TextField fx:id="DefaultPathField" layoutX="111.0" layoutY="6.0" prefHeight="25.0" prefWidth="195.0" />
<Label layoutX="14.0" layoutY="10.0" text="Složka s obrázky" />
<CheckBox fx:id="NewPhoto" layoutX="14.0" layoutY="46.0" mnemonicParsing="false" text="Vytvářet nové obrázky" />
<CheckBox fx:id="MySize" layoutX="14.0" layoutY="74.0" mnemonicParsing="false" text="Vlastní velikost screenshotu" />
<TextField fx:id="ImageWidth" layoutX="254.0" layoutY="91.0" prefHeight="25.0" prefWidth="64.0" />
<Text layoutX="223.0" layoutY="108.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Šířka" />
<Text layoutX="100.0" layoutY="108.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Výška" />
<TextField fx:id="ImageHeight" layoutX="143.0" layoutY="91.0" prefHeight="25.0" prefWidth="71.0" />
</children>
<effect>
<InnerShadow blurType="ONE_PASS_BOX" />
</effect>
</AnchorPane>
Petr Štechmüller:8.12.2015 21:32
Tak jsem si zkopiroval tvůj kód z kontroleru a první, co na mě IDE křičí je, že nemůžeš instancovat třídu Camera.
Tomáš Brůna:8.12.2015 21:36
kód z kamery ja tady
public class Camera {
private int index;
private Rectangle rect;
public Camera(int index)
{
this.index = index;
}
public void TakePhoto(String path, Boolean checkedNew, Boolean checkedSize, int height, int width)
{
try {
if (checkedNew == false) // pokud se při vyfocení nemají vytvářet nové obrázky
{
if (checkedSize)
{
this.rect = new Rectangle();
rect.height = 30;
rect.width = 30;
}
else
{
this.rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
}
BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ImageIO.write(image, "png", new File(path + "/screenshot.png"));
System.out.println("ok");
}
else
{
index++;
BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ImageIO.write(image, "png", new File(path + "/screenshot" + String.valueOf(this.index) + ".png"));
System.out.println("ok");
}
}
catch(Exception e){System.out.println("chyba: " + e);};
}
}
Petr Štechmüller:8.12.2015 21:36
OK, mě to došlo hned, co jsem odeslal příspěvek, že ta kamera asi bude Tvoje...
Petr Štechmüller:8.12.2015 21:41
Asi už jsem na to přišel. Ty jsi vyplnil použe políčko šířka, ale políčko výška bylo prázdné. Máš docela nešikovně napsanou podmínku, kde zjišťuješ, zda-li je políčko vyplněný.
Petr Štechmüller:8.12.2015 21:57
Já bych ji napsal obráceně. Zjišťoval bych, jestli políčko není
vyplněno, tak nic nedělej.
Takže asi nějak takhle:
if (ImageHeight.getText() == null || Integer.parseInt(ImageHeight.getText()) == 0) {
return;
}
if (ImageWidth.getText() == null || Integer.parseInt(ImageWidth.getText()) == 0) {
return;
}
Tím si zajistím, že na řádcích za těmito podmínkami budu mít v těch políčkách nějakou hodnotu...
Petr Štechmüller:8.12.2015 21:58
A místo kontroly na null bych spíš kontroloval, jestli text je empty
ImageWidth.getText().isEmpty()
+20 Zkušeností
+2,50 Kč
Zobrazeno 17 zpráv z 17.