[Java] Farenheit2Celcius konverterare, fixa ERROR vid inmatning av fel värde?

Permalänk
Medlem

[Java] Farenheit2Celcius konverterare, fixa ERROR vid inmatning av fel värde?

Hejsan

Fick så fin handledning på min förra labb så jag hoppas att ni kan hjälpa mig igen :). Jag har skrivit ett litet program i Java som konverterar Farenheit till Celcius och vice versa. Värdet man vill konvertera skrivs i ett textfält och när man trycker på det man vill konvertera till hamnar svaret i en label.

Allt fungerar fint, dock vill jag att ett ERROR medelande ska visas i labeln när jag skriver in ett annat värde än siffrorna 0-9. Värdet "1020" ska fungera men inte tex "ABC!=#¤".

Här är koden

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class F2C extends JFrame{ private String buttonTitleC2F = "C to F"; private String buttonTitleF2C = "F to C"; private JButton C2FButton = new JButton(buttonTitleC2F); private JButton F2CButton = new JButton(buttonTitleF2C); private JPanel panel = new JPanel(); private JLabel label; private JTextField tempTextField; public F2C(){ super ("Farenheit to Celcius converter"); panel.setLayout(new FlowLayout()); getContentPane().add(panel); panel.setBackground(Color.gray); label = new JLabel(""); tempTextField = new JTextField (5); panel.add(C2FButton); panel.add(F2CButton); panel.add(tempTextField); panel.add(label); C2FButton.addActionListener(new ButtonListener()); F2CButton.addActionListener(new ButtonListener2()); } private class ButtonListener implements ActionListener { public void actionPerformed (ActionEvent evt){ int tempFahr = (int) ((Double.parseDouble(tempTextField.getText())) * 1.8 +32); String tempF2C = String.valueOf(tempFahr); label.setText(tempF2C+ " C"); } } private class ButtonListener2 implements ActionListener { public void actionPerformed (ActionEvent evt){ int tempCelc = (int) (((Double.parseDouble(tempTextField.getText())) -32) /1.8); String tempC2F = String.valueOf(tempCelc); label.setText(tempC2F + " F"); } } public static void main(String[] args) throws Exception{ F2C panel = new F2C(); panel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel.setSize(400, 100); panel.setVisible(true); } }

Om ni ser något annat som ser mysko ut kan ni gärna nämna det också, tack på förhand!

Permalänk
Medlem

Omslut dina Double.parseDouble med try-catch:

String input = "tralalala"; try { double d = Double.parseDouble(input); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Inte ett tal: " + input, "Fel", JOptionPane.ERROR_MESSAGE); }

Permalänk
Medlem

Du skulle också kunna använda dig av ett Formatted Text Field.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av badboll
Omslut dina Double.parseDouble med try-catch:

String input = "tralalala"; try { double d = Double.parseDouble(input); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Inte ett tal: " + input, "Fel", JOptionPane.ERROR_MESSAGE); }

Här är det kanske bättre att fånga NumberFormatException, som parseDouble slänger.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Citat:

Ursprungligen inskrivet av Phod
Här är det kanske bättre att fånga NumberFormatException, som parseDouble slänger.

Sant, du bör itne surpressa exceptions i onödan...

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Har man riktig otur eller är klantig kan den kasta ett NullPointerException också. Då vill jag mena att det just här är bättre att användaren får meddelandet "Inte ett tal: null" än att konverteringen sonika misslyckas och en stacktrace pumpas ut till System.err (vilket en vanlig användare av en Swing-applikation inte kommer se, och därför upplever att "ingenting händer").

Vill man vara petig och ge maximal feedback kan man ju separera fallen:

String input = "tralalala"; try { double d = Double.parseDouble(input); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, "Inte ett tal: " + input, "Fel", JOptionPane.ERROR_MESSAGE); } catch (Throwable th) { JOptionPane.showMessageDialog(this, "Kan inte konvertera: ett oväntat fel av typen " + th.getClass().getName() + " har inträffat.", "Fel", JOptionPane.ERROR_MESSAGE); th.printStackTrace(); }

...men orka vara petig i en sådan här trivial applikation. Korrekt felhantering är visserligen jättebra, men det blir samtidigt lätt en massa extra brus som stjäl uppmärksamhet från det som verkligen är viktigt i en sådan här labb.

Permalänk
Citat:

Ursprungligen inskrivet av badboll
Har man riktig otur eller är klantig kan den kasta ett NullPointerException också. Då vill jag mena att det just här är bättre att användaren får meddelandet "Inte ett tal: null" än att konverteringen sonika misslyckas och en stacktrace pumpas ut till System.err (vilket en vanlig användare av en Swing-applikation inte kommer se, och därför upplever att "ingenting händer").

Vill man vara petig och ge maximal feedback kan man ju separera fallen:

String input = "tralalala"; try { double d = Double.parseDouble(input); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, "Inte ett tal: " + input, "Fel", JOptionPane.ERROR_MESSAGE); } catch (Throwable th) { JOptionPane.showMessageDialog(this, "Kan inte konvertera: ett oväntat fel av typen " + th.getClass().getName() + " har inträffat.", "Fel", JOptionPane.ERROR_MESSAGE); th.printStackTrace(); }

...men orka vara petig i en sådan här trivial applikation. Korrekt felhantering är visserligen jättebra, men det blir samtidigt lätt en massa extra brus som stjäl uppmärksamhet från det som verkligen är viktigt i en sådan här labb.

haha, sweclockers är petiga men man bör kanske catcha nullpointerexception separat

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

har inte java tryparse, eller var det c#? tänka sig vad man glömmer fort :S

Permalänk
Citat:

Ursprungligen inskrivet av Dalton Sleeper
har inte java tryparse, eller var det c#? tänka sig vad man glömmer fort :S

C# har ifall tryparse Man använder sig då av outparametrar
http://msdn.microsoft.com/en-us/library/f02979c7.aspx

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase