《java核心技术卷Ⅰ》第七章:异常、断言和日志

第七章:异常、断言和日志

对于异常情况, 例如, 可能造成程序崩溃的错误输入,Java 使 用 一 种 称 为 异 常 处 理 ( exception handing) 的错误捕获机制处理。Java 中的异常处理与 C++ 或 Delphi 中的异常处理 十分类似。本章的第 1 部分先介绍 Java 的异常。 在测试期间, 需要进行大量的检测以验证程序操作的正确性。 然而,这些检测可能非常耗 时,在测试完成后也不必保留它们,因此,可以将这些检测删掉, 并在其他测试需要时将它们粘 贴回来,这是一件很乏味的事情。本章的第 2 部分将介绍如何使用断言来有选择地启用检测。 当程序出现错误时,并不总是能够与用户或终端进行沟通。此时,可能希望记录下出现 的问题,以备日后进行分析。本章的第 3 部分将讨论标准 Java 日志框架。

  • 第七章异常断言和日志
    • 知识点整理
    • 分析堆栈轨迹元素
    • 记录日志


知识点整理

《java核心技术卷Ⅰ》第七章:异常、断言和日志_第1张图片


分析堆栈轨迹元素

  • StackTraceTest.java
package stackTrace;

import java.util.*;

public class StackTraceTest {
    /**
     * Computes the factorial of a number
     * @param n a non-negative integer
     * @return n! = 1 * 2 * 3 ... * n
     */
    public static int factorial(int n) {
        System.out.println("factorial(" + n + "):");
        Throwable t = new Throwable();
        StackTraceElement[] frames = t.getStackTrace();
        for(StackTraceElement f : frames)
            System.out.println(f);
        int r;
        if(n <= 1) r = 1;
        else r = n * factorial(n - 1);
        System.out.println("return " + r);
        return r;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter n: ");
        int n = in.nextInt();
        factorial(n);
    }
}

记录日志

  • LoggingImageViewer.java
package logging;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.logging.*;
import javax.swing.*;

public class LoggingImageViewer {
    public static void main(String[] args) {
        if(System.getProperty("java.util.logging.config.class") == null && System.getProperty("java.util.logging.config.file") == null) {
            try {
                Logger.getLogger("com.horstmann.corejava").setLevel(Level.ALL);
                final int LOG_ROTATION_COUNT = 10;
                Handler handler = new FileHandler("%h/LoggingImageViewer.log", 0, LOG_ROTATION_COUNT);
                Logger.getLogger("com.horstmann.corejava").addHandler(handler);
            }
            catch(IOException e) {
                Logger.getLogger("com.horstmann.corejava").log(Level.SEVERE, "Can't create log file handler", e);
            }
        }

        EventQueue.invokeLater(() -> 
            {
                Handler windowHandler = new WindowHandler();
                windowHandler.setLevel(Level.ALL);
                Logger.getLogger("com.horstmann.corejava").addHandler(windowHandler);

                JFrame frame = new ImageViewerFrame();
                frame.setTitle("LoggingImageViewer");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                Logger.getLogger("com.horstmann.corejava").fine("Showing frame");
                frame.setVisible(true);
            });
    }
}

/*
 * The frame that shows the image
 */
class ImageViewerFrame extends JFrame{
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 400;

    private JLabel label;
    private static Logger logger = Logger.getLogger("com.horstmann.corejava");

    public ImageViewerFrame() {
        logger.entering("ImageViewerFrame", "");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        //set up menu bar
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu menu = new JMenu("File");
        menuBar.add(menu);

        JMenuItem openItem = new JMenuItem("Open");
        menu.add(openItem);
        openItem.addActionListener(new FileOpenListener());

        JMenuItem exitItem = new JMenuItem("Exit");
        menu.add(exitItem);
        exitItem.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent event) {
                        logger.fine("Exiting.");
                        System.exit(0);
                    }
                });
        //use a label to display the images
        label = new JLabel();
        add(label);
        logger.exiting("ImageViewerFrame", "");
    }

    private class FileOpenListener implements ActionListener{
        public void actionPerformed(ActionEvent event) {
            logger.entering("ImageViewerFrame.FileOpenListener", "actionPerformed", event);

            //set up file chooser
            JFileChooser chooser = new JFileChooser();
            chooser.setCurrentDirectory(new File("."));

            //accept all files ending with .gif
            chooser.setFileFilter(new javax.swing.filechooser.FileFilter()
                    {
                        public boolean accept(File f) {
                            return f.getName().toLowerCase().endsWith(".gif") || f.isDirectory();
                        }

                        public String getDescription() {
                            return "GIF Images";
                        }
                    });

            //show file chooser dialog
            int r = chooser.showOpenDialog(ImageViewerFrame.this);

            //if image file accepted, set it as icon of the label
            if(r == JFileChooser.APPROVE_OPTION) {
                String name = chooser.getSelectedFile().getPath();
                logger.log(Level.FINE, "Reading file {0}", name);
                label.setIcon(new ImageIcon(name));
            }
            else logger.fine("File open dialog canceled.");
            logger.exiting("ImageViewerFrame.FileOpenListener", "actionPerformed");
        }
    }
}

/**
 * A handler for displaying log records in a window
 */
class WindowHandler extends StreamHandler{
    private JFrame frame;

    public WindowHandler() {
        frame = new JFrame();
        final JTextArea output = new JTextArea();
        output.setEditable(false);
        frame.setSize(200, 200);
        frame.add(new JScrollPane(output));
        frame.setFocusableWindowState(false);
        frame.setVisible(true);
        setOutputStream(new OutputStream()
                {
                    public void write(int b) {
                        //not called
                    }

                    public void write(byte[] b, int off, int len) {
                        output.append(new String(b, off, len));
                    }
                });
    }

    public void publish(LogRecord record) {
        if(!frame.isVisible()) return;
        super.publish(record);
        flush();
    }
}

你可能感兴趣的:(《java核心技术Ⅰ》学习笔记)