A frame with a panel for testing various exceptions
/* This program is a part of the companion code for Core Java 8th ed. (http://horstmann.com/corejava) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ import java.awt.EventQueue; import java.awt.event.*; import javax.swing.*; import java.io.*; /** * @version 1.33 2007-06-12 * @author Cay Horstmann */ public class ExceptTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { ExceptTestFrame frame = new ExceptTestFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } /** * A frame with a panel for testing various exceptions */ class ExceptTestFrame extends JFrame { public ExceptTestFrame() { setTitle("ExceptTest"); ExceptTestPanel panel = new ExceptTestPanel(); add(panel); pack(); } } /** * A panel with radio buttons for running code snippets and studying their exception behavior */ class ExceptTestPanel extends Box { public ExceptTestPanel() { super(BoxLayout.Y_AXIS); group = new ButtonGroup(); // add radio buttons for code snippets addRadioButton("Integer divide by zero", new ActionListener() { public void actionPerformed(ActionEvent event) { a[1] = 1 / (a.length - a.length); } }); addRadioButton("Floating point divide by zero", new ActionListener() { public void actionPerformed(ActionEvent event) { a[1] = a[2] / (a[3] - a[3]); } }); addRadioButton("Array bounds", new ActionListener() { public void actionPerformed(ActionEvent event) { a[1] = a[10]; } }); addRadioButton("Bad cast", new ActionListener() { public void actionPerformed(ActionEvent event) { a = (double[]) event.getSource(); } }); addRadioButton("Null pointer", new ActionListener() { public void actionPerformed(ActionEvent event) { event = null; System.out.println(event.getSource()); } }); addRadioButton("sqrt(-1)", new ActionListener() { public void actionPerformed(ActionEvent event) { a[1] = Math.sqrt(-1); } }); addRadioButton("Overflow", new ActionListener() { public void actionPerformed(ActionEvent event) { a[1] = 1000 * 1000 * 1000 * 1000; int n = (int) a[1]; } }); addRadioButton("No such file", new ActionListener() { public void actionPerformed(ActionEvent event) { try { InputStream in = new FileInputStream("woozle.txt"); } catch (IOException e) { textField.setText(e.toString()); } } }); addRadioButton("Throw unknown", new ActionListener() { public void actionPerformed(ActionEvent event) { throw new UnknownError(); } }); // add the text field for exception display textField = new JTextField(30); add(textField); } /** * Adds a radio button with a given listener to the panel. Traps any exceptions in the * actionPerformed method of the listener. * @param s the label of the radio button * @param listener the action listener for the radio button */ private void addRadioButton(String s, ActionListener listener) { JRadioButton button = new JRadioButton(s, false) { // the button calls this method to fire an // action event. We override it to trap exceptions protected void fireActionPerformed(ActionEvent event) { try { textField.setText("No exception"); super.fireActionPerformed(event); } catch (Exception e) { textField.setText(e.toString()); } } }; button.addActionListener(listener); add(button); group.add(button); } private ButtonGroup group; private JTextField textField; private double[] a = new double[10]; }