HiveBrain v1.2.0
Get Started
← Back to all entries
debugjavaMinor

Simple Operations Calculator

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
simpleoperationscalculator

Problem

I'm practicing Swing effects. Everything works but for some reason I get a ton of error messages in the command prompt when the fields are empty, despite my attempt to add some exception handling (this has made me realize I need to practice that a lot more).

```
/* Author: Luigi Vincent
Practicing Java Swing button and button events; Window that does simple calculation on two numbers
TO DO: Figure out why command prompt show so many messages when fields are empty & stop it
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;

public class SimpleCalc extends JFrame {

SimpleCalc (String name) {
super(name);

setLayout(new FlowLayout());

// Fields for input and output
JTextField result = new JTextField(10);
JTextField num1 = new JTextField(5);
JTextField num2 = new JTextField(5);
result.setEditable(false);

// Buttons for operations
JButton b_add = new JButton("Add");
JButton b_sub = new JButton("Subtract");
JButton b_mul = new JButton("Multiply");
JButton b_div = new JButton("Divide");

// Listener to handle operations
ActionListener calculator = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
if (num1.getText().length() == 0 || num2.getText().length() == 0) {
throw new Exception();
}
}
catch (Exception ex){
JOptionPane.showMessageDialog(null, "Field missing", "Warning", JOptionPane.WARNING_MESSAGE);
}

Double alpha = Double.parseDouble(num1.getText());
Double beta = Double.parseDouble(num2.getText());
Double omega = null;
DecimalFormat f = new DecimalFormat("##.00");

if (e.getSource() == b_add) {
om

Solution

The major problem I can see is this piece of code :

try {
                if (num1.getText().length() == 0 || num2.getText().length() == 0) {
                    throw new Exception();
                }
            }
            catch (Exception ex){
                JOptionPane.showMessageDialog(null, "Field missing", "Warning", JOptionPane.WARNING_MESSAGE);
            }


If you throw inside a try-catch, you will not exit the function. Since your condition is num1.getText().length() == 0 when you try to do Double.parseDouble(num1.getTest() well your string is empty so this throw an exception.

You should not use throw and catch to manage an error, not in this way. You should first remove the try-catch and work with a simple if :

if (num1.getText().isEmpty() || num2.getText().isEmpty()) {
    JOptionPane.showMessageDialog(null, "Field missing", "Warning", JOptionPane.WARNING_MESSAGE);
    throw new Exception();
}


I would not suggested that since now you add a complexity to your code.

-
The method now need to declare throws Exception (which is not possible for actionPerformed()), now the caller need to manage this possible outcome.

-
Exception would be too generic.

-
I guess that this case would happen a lot,so throwing an Exception could become heavy for the program.

The real solution is to only return from the method. You've already warned the user that he need to do something (you could be more clear) and you don't want to execute the rest of method.

There is some general notion that are lacking in your code, but I won't cover it all, since I mention it in others answer :

-
There is naming convetions in Java, b_add does not follow it, it should be bAdd (but it could simply be add)

-
You should not extend JFrame, but rather just have a private JFrame, you're not adding any functionnality to JFrame you're only using it. (Composition over inheritance) answer that cover a bit that part

Code Snippets

try {
                if (num1.getText().length() == 0 || num2.getText().length() == 0) {
                    throw new Exception();
                }
            }
            catch (Exception ex){
                JOptionPane.showMessageDialog(null, "Field missing", "Warning", JOptionPane.WARNING_MESSAGE);
            }
if (num1.getText().isEmpty() || num2.getText().isEmpty()) {
    JOptionPane.showMessageDialog(null, "Field missing", "Warning", JOptionPane.WARNING_MESSAGE);
    throw new Exception();
}

Context

StackExchange Code Review Q#56970, answer score: 4

Revisions (0)

No revisions yet.