Java - JOptionPane - NullPointerException

Programovacie jazyky, rady, poradňa...
Shwollo
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2543
Registrovaný: 04 dec 2006, 14:35
Bydlisko: LM / Brno

Java - JOptionPane - NullPointerException

Príspevok od používateľa Shwollo »

vždy, keď kliknem na cancel hodí NullPointerException: String is null
ako to mám fixnúť?

Kód: Vybrať všetko

String s = (String) JOptionPane.showInputDialog(
                            null,
                            "insert text\n",
                            "text",
                            JOptionPane.PLAIN_MESSAGE,
                            null,
                            null,
                            "");
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa jorg22 »

Mozes to hodit do try, catch bloku, tym sa vyhnes padu programu pri vynimkach a mozes ich spracovat podla seba.
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa manager666 »

Ziadnu NullPointerException to nehadze, chybu mas niekde dalej, kde sa pokusas spracovavat ten retezec.
Plus, kedze nevyuzivas posledne tri parametre, preco nevyuzivas pretazenu metodu, ktora vracia rovno String ?

jorg22:
Pouzivat try catch blok na kazdu somarinu je kontraproduktivne.
Jedno zo zakladnych pravidiel = odchytavat vynimky iba vtedy, ked je to jedine/najlepsie riesenie, v opacnom pripade im treba predchadzat. :roll:
Shwollo
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2543
Registrovaný: 04 dec 2006, 14:35
Bydlisko: LM / Brno

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa Shwollo »

chybu mi to hádzalo ešte tu

Kód: Vybrať všetko

graphics.drawString(text, x, y);
ale pokiaľ som nedal cancel tak všetko fungoval tak ako malo.
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa manager666 »

A je to jasne, z dokumentacie metody drawString:
Throws:NullPointerException - if str is null.
Shwollo
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2543
Registrovaný: 04 dec 2006, 14:35
Bydlisko: LM / Brno

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa Shwollo »

super. diky ;)
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa axxis »

manager666 napísal:A je to jasne, z dokumentacie metody drawString:
Throws:NullPointerException - if str is null.
tak toto bolo fakt necakane, nullpointer ked je string null, kto by si to len pomyslel, ako dobre, ze dokumentacia ma tieto zaludnosti podchytene
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa manager666 »

:?: :?: :?:
Kludne mohla byt metoda drawString naprogramovana tak, ze nevyhodi ziadnu vynimku, alebo vyhodi uplne inu vynimku, etc. Celym svojim prispevkom som chcel poukazat na to, ze treba citat dokumentaciu. :smt006
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa javatar »

trosku neskoro ale pre pripadneho citatela - vzdy ked je moznost v dialogovom okne zrusit akciu (ukladanie suboru, otvaranie suboru, vlozenie vstupu) je nutne v kode kontrolovat ci bol vlozeny vstup a verifikovat ho - inak povedane, jeden if pre pripad ked uzivatel nieco poserie (alebo na poslednu chvilu zmeni nazor) je tam nutny...
Shwollo
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2543
Registrovaný: 04 dec 2006, 14:35
Bydlisko: LM / Brno

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa Shwollo »

skúšal som tam dať if(s==null) ale nešlo to. Stále robilo to isté
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa axxis »

nemal si skor pouzit if(s != null )?
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa javatar »

vidim ze axxis ma predbehol - cakame na odpoved, ak ti robi stale to iste tak posli viac kodu
Shwollo
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2543
Registrovaný: 04 dec 2006, 14:35
Bydlisko: LM / Brno

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa Shwollo »

keď tam mám try catch tak to funguje tak ako chcem

Kód: Vybrať všetko

public class ImageExporter {

    private List<GraphicsObject> objects;
    private Component frame;
    PaintSurface ps = new PaintSurface();
  
    public ImageExporter(List<GraphicsObject> objects) {
        this.objects = objects;
        objects.add(new FillRectangle(0, 0, ps.getWidth(), ps.getHeight(), Color.yellow));
    }

    public void saveAsPng(String name, int width, int height) {

        if (name == null) {
        }

        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D ig2 = bi.createGraphics();
        Font font = new Font("TimesRoman", Font.BOLD, 20);
        ig2.setFont(font);
        try {
            for (GraphicsObject obj : objects) {
                obj.draw(ig2);
            }
        } catch (NullPointerException e) {
        }
        try {
            String s = (String) JOptionPane.showInputDialog(
                    null,
                    "Insert image name\n",
                    "Image name",
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    null,
                    "");
            try {
                if (s.length() == 0 && s != null) {
                    JOptionPane.showMessageDialog(frame,
                            "The name was set to >image<");
                    s = "image";
                }
            } catch (NullPointerException nullPointerException) {
            }

            Object[] possibilities = {"png", "jpg", "bmp"};
            String img = (String) JOptionPane.showInputDialog(
                    frame,
                    "save as type\n",
                    "Save type",
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    possibilities,
                    "");

            try {
                if (img.equals("png")) {
                    ImageIO.write(bi, "PNG", new File("output\\ " + s + ".PNG"));
                }
                if (img.equals("jpg")) {
                    ImageIO.write(bi, "JPEG", new File("output\\ " + s + ".JPG"));
                }
                if (img.equals("bmp")) {
                    ImageIO.write(bi, "BMP", new File("output\\ " + s + ".BMP"));
                }
                
            } catch (NullPointerException nullPointerException) {
            }
            if (img != null) {
                JOptionPane.showMessageDialog(frame,
                        "The image was saved as output\\" + s + "." + img);
            }

        } catch (IOException ex) {
            Logger.getLogger(ImageExporter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa manager666 »

Kód: Vybrať všetko

if (s.length() == 0 && s != null)
Toto je podla teba v poriadku ? Skus sa nad tym zamysliet...
Ale tych chyb tam je daleko viac. Ty si programator-samouk, vsak ? :roll: To by ani tak nevadilo, avsak ocividne sa ucis zo zlych zdrojov...
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa javatar »

manager666 - nedemotivuj, zaciatocnicke chyby sem tam spravim aj teraz
Shwollo - manager ti napriek demotivujucemu smajliku oznacil chybne miesto

par veci ktore by ti mohli pomoct:
Ak mas v podmienke viac vyrazov a testujes tam premennu na null a potom na nieco ine tak tam MUSI byt operator AND a testovanie na NULL MUSI byt ako prve

ta podmienka ktoru mas ty je dana uplne chybne, preberieme si tieto scenare
a) mas nieco vykonat pokial je zadany neaky retazec dlzky vacsej ako nula - vtedy testujes ci nie je NULL a az potom jeho velkost
Spravne riesenie:
if (s != null && s.length()>0 )
Nespravne riesenia ktore vsak v pripade validneho vstupu spravne prejdu
if (s.length()>0 && s != null )
if !(s.length()==0 || s == null )
v oboch pripadoch v pripade ze s je rovne null dostanes null pointer exception

b) mas nieco vykonat pokial je vstup null alebo nulovej dlzky (vypisat chybovu hlasku, zalogovat do databazy ze uzivatel je idiot a podobne)
Spravne riesenie:
if !(s != null && s.length()>0 )
Funkcne ale zlozite riesenie (vo vseobecnosti nespravne ale v inom kontexte):
if (s == null){ doSomethig();} else { if (s.length()==0) doSomething();}
Nesprasvne riesenie ktore ale prelezie ak bude nulovy retazec
if (s == null || s.length()==0 ) -> toto hodi v pripade ze s == null, nullPointerException

ak nechapes pytaj sa...
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa harrison314 »

ja by som len rad podotkol:

s==null -> nullPointexException -> programator je idiot
s.lenght() == 0 -> uzivatel je idiot

Treba rozlisovat medzi checkt a uncheckt vynimkami, za uncheckt (nullpointer, arguments.... ) moze programator a preto by sa nemali odchytavat a v ziadnom pripade zahadzovat
ropman
Medium Professional
Medium Professional
Príspevky: 1250
Registrovaný: 12 apr 2010, 21:07

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa ropman »

okrem toho ani tak ako si to napisal ti to nebude fungovat ako ocakavas pretoze ked user klikne na cancel tak to hodi nullpointer exception, tym padom ti to hned skoci do catch bloku a ,,s" (uzasny nazov premennej btw :)) sa nenastavi na tu default hodnotu (image)... cize treba prehodit tu podmienku ako ti napisali a uplne zrusit try-catch... ten nullpointer vznika na tomto: s.lenght() vtedy ak je s null (nemozes volat metodu ak je premenna null). ale ked to spravis takto:

Kód: Vybrať všetko

if (s != null && s.length()>0 )
tak sa s.lenght() nevykona nikdy ak je s null, pretoze s!=null ma vtedy hodnotu false a tak nie je potrebne vyhodnocovat s.length() lebo ci to bude true alebo false, vysledok celej podmienky bude vzdy false
Shwollo
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2543
Registrovaný: 04 dec 2006, 14:35
Bydlisko: LM / Brno

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa Shwollo »

keď tam mám

Kód: Vybrať všetko

if (s != null && s.length()>0 )
tak mi názov súboru nastavuje defaultne na "image" - aj keď formulár nie je prázdny

Ja by som to chcel takto:
user zadá text klikne na OK - názov súboru bude text
user nezadá nič a klikne na OK - názov bude defaulne image
user klikne na cancel - nič sa nestane - tu mi vždy hodilo nullpointer
javatar
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6112
Registrovaný: 12 aug 2010, 14:49
Bydlisko: I don't exist at all.

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa javatar »

chvilu mi to trvalo ale verim, ze mam riesenie - null pointer exception ti zrejme hadzalo ked si chcel null referenciu pretrypovat na string - toto by uz malo ist

Kód: Vybrať všetko

String s;
Object o = JOptionPane.showInputDialog(
                    null,
                    "Insert image name\n",
                    "Image name",
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    null,
                    "");
if (o != null){
    s = o.toString().length()==0?"image":o.troString();
}
urcite by sa to dalo aj krajsie ale idem uz spat - pamataj, ze vsetko kde pouzivas ten vstup musi byt tiez v ten if vetve
Shwollo
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2543
Registrovaný: 04 dec 2006, 14:35
Bydlisko: LM / Brno

Re: Java - JOptionPane - NullPointerException

Príspevok od používateľa Shwollo »

funguje to. diky ;)

a ešte by som mal jednu otázku:
mám tam na výber ukladať obrázok ako png, jpg a bmp.
pri png funguje normálne.
pri jpg mi obrázok uloží, ale nejak divne zmení farby. To, čo má byť červené je modré, zelené je červené a pod.
pri bmp mi ho neuloží vôbec.

kde tam mám chybu?
Napísať odpoveď