windows - Sådan oprettes Java-undtagelse, når String er indtastet i stedet for heltal i JTextField?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har problemer med at gøre undtagelse, hvis du skriver en streng i en JTextField i stedet for heltal. Jeg vil opsummere indtastningsnumre og skrive resultatet på en JButton, hver gang jeg klikede på det. Hver gang jeg klikker på knappen, får jeg en fejl:
*


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at EnaP.actionPerformed(EnaP.java:12)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)...


*


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Ena {
    public static JTextField a;
    public static JTextField b;

    public static void main(String[] args) {
        JFrame okno = new JFrame();
        okno.setSize(400, 200);

        a = new JTextField("Number1");
        b = new JTextField("Number2");

        JButton gumb = new JButton("SUM");
        gumb.setPreferredSize(new Dimension(200,200));
        EnaP poslusalec = new EnaP();
        gumb.addActionListener(poslusalec);

        JPanel p = new JPanel();
        p.add(a);
        p.add(b);
        okno.add(gumb, BorderLayout.EAST);
        okno.add(p, BorderLayout.WEST);
        okno.setTitle("Sum");

        okno.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);
        okno.setVisible(true);

    }

}


og anden klasse - lytter:


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class EnaP implements ActionListener{

    public void actionPerformed(ActionEvent e) {
        JButton gumb = (JButton) e.getSource();

        try{
            String a = Ena.a.getSelectedText().toString();
            String b = Ena.b.getSelectedText().toString();
            int x = Integer.parseInt(a);
            int y = Integer.parseInt(b);
            int sum = x+y;
            gumb.setText(""+sum);
        }
        catch (NumberFormatException n) {
             System.out.println("Please enter a number.");
        }
    }

}


Jeg ved ikke, hvordan man fikser det ...

Bedste reference


Du skal tjekke for først og derefter smide din egen undtagelse for eksempel!


I øjeblikket går din kode:


String a = Ena.a.getSelectedText().toString();


Og det faktum, at du allerede forsøger at kalde toString() på resultatet af getSelectedText() forårsager, at NPE.


Du vil have:


String fieldAsString = Ena.a.getSelectedText();
if (fieldAsString != null) {      
  try {
    int x = Integer.parseInt(fieldAsString);
  ...


i stedet!


Bemærk: getSelectedText() returnerer allerede String . Der er nej pege på at ringe toString() på det String-objekt!


Endelig: undgå de intet at fortælle et tegn navne for dine variabler. Brug navne, der siger hvad den ting bag navnet handler om!

Andre referencer 1


Du ringer getSelectedText(), når du skal ringe getText(). Dokumentationen for getSelectedText() siger: [27] [28]



  Returnerer den valgte tekst i denne TextComponent. Hvis valget er null eller dokumentet tomt, returneres null.



Dette ville kun returnere tekst, hvis brugeren havde valgt hele eller en del af teksten i JTextField. For blot at få det, der er skrevet i JTextField, brug getText().


Der er et par andre problemer med din kode. Du bør ikke lave tekstfelterne public static som dette, og det skaber i det væsentlige globale variabler. Det vil ikke komme dig i problemer i et så kort program, men du vil hurtigt komme i problemer, når dine programmer vokser.


I stedet gør dem private, sørg for getters for dem, instans en forekomst af Ena og send det til konstruktøren for EnaP og ring til getters for at få adgang til dem. På denne måde vil kun forekomsten af ​​EnaP, der blev oprettet til at være handlingslytteren til knappen i tilfælde af Ena, få adgang til tekstfelterne.


Også som GhostCat påpegede, giver dine variabelnavne ikke nogen information om, hvad de repræsenterer, eller hvilke værdier de vil indeholde. Det betyder ikke noget meget i et meget lille program, men bliver stadig vigtigere jo større er programmet får.

Andre referencer 2


Hvad GhostCat har sagt til dig, er alt korrekt.


Et andet problem er: Ena.a.getSelectedText() returnerer den markerede (= fremhævede) tekst fra inputfeltet. Jeg er sikker på, at det ikke er, hvad du vil have.


Fra javadok:



  offentlig String getSelectedText ()

  Returnerer den markerede tekst, der er indeholdt i
  denne tekstkomponent.

  Hvis markeringen er null eller dokumentet er tomt,
  returnerer null.

  
  Returnerer: teksten

  
  Throws: IllegalArgumentException - if
  udvælgelsen har ikke en gyldig kortlægning i dokumentet for nogle
  grund



Brug Ena.a.getText() i stedet