王豔 201771010127《面向對象程序設計(java)》第九周學習總結

實驗九 異常、斷言與日誌java

實驗時間 2018-10-25編程

1、實驗目的與要求數組

(1) 掌握java異常處理技術;app

(2) 瞭解斷言的用法dom

(3) 瞭解日誌的用途;學習

(4) 掌握程序基礎調試技巧;測試

一:理論部分。this

一:處理錯誤。編碼

錯誤類型:1)用戶輸入錯誤;2)設備錯誤;3)物理限制;4)代碼錯誤spa

1.異常:在程序的執行過程當中所發生的異常事件,它中斷指令的正常執行。異常對象都是派生於Throwable類的一個實例。

全部異常類都是由Throwable繼承而來,在下一層分解爲兩個支:Error(致命錯誤)和Exception(非致命錯誤)。

設計java程序時,關注Exception層次結構。Exception層次結構又分解爲兩個分支:一個分支派生於RuntimeException;另外一個分支包含其餘異常。RuntimeException爲運行時異常類,通常是程序錯誤產生。

派生於RuntimeException的異常包含下面幾種狀況:

1)錯誤的類型轉換

2)數組訪問越界

 3)訪問空指針

Java將派生於Error類或RuntimeException類的全部異常稱爲未檢查異常,編譯器容許不對它們作出異常處理。

2.拋出異常:聲明拋出異常在方法聲明中用throws子句中來指明。

1)throws子句能夠同時指明多個異常,說明該方法將不對這些異常進行處理,而是聲明拋出它們。

2)一個方法必須聲明該方法全部可能拋出的已檢查異常,而未檢查異常要麼不可控制(Error),要麼應該避免發生(RuntimeException)。若是方法沒有聲明全部可能發生的已檢查異常,編譯器會給出一個錯誤消息。

3)拋出異常對象經過throw語句來實現。

3.建立異常類。

自定義異常類:定義一個派生於Exception的直接或間接子類。如一個派生於IOException的類。

4.捕獲異常:

1)捕獲異常的第一步是用try{}子句選定捕獲異常的代碼範圍,由try所限定的代碼塊中的語句在執行過程當中可能會自動生成異常對象並拋出。

2)catch子句:catch塊是對異常對象進行處理的代碼;

a.每一個try代碼塊能夠伴隨一個或多個catch語句,用於處理try代碼塊中所生成的各種異常事件;

b.catch語句只須要一個形式參數指明它所能捕獲的異常類對象,這個異常類必須是Throwable的子類,運行時系統經過參數值把被拋出的異常對象傳遞給catch塊;

c.catch塊能夠經過異常對象調用類Throwa。

getMessage:用來獲得有關異常事件的信息;

printStackTrace:用來跟蹤異常事件發生時執行堆棧的內容。

5.堆棧跟蹤:程序執行中一個方法調用過程的列表,它包含了程序執行過程當中方法調用的特定位置。

6.程序編碼時異常處理的兩種方式:

1)積極處理方式:確切知道如何處理的異常應該捕獲;

2)消極處理方式:不知道如何去處理的異常聲明拋出。

 2、實驗內容和步驟

實驗1:用命令行與IDE兩種環境下編輯調試運行源程序ExceptionDemo一、ExceptionDemo2,結合程序運行結果理解程序,掌握未檢查異常和已檢查異常的區別。

異常示例1:

package testing;
public class ExceptionDemo1 {
    public static void main(String args[]) {
        int a = 0;
        System.out.println(5 / a);
    }
}

程序運行以下:

因分母爲零,程序在運行過程當中出現異常。修改後程序以下:

package testing;
public class ExceptionDemo1 {
    public static void main(String args[]) {
        int a = 0;
        if(a==0){
            System.out.println("程序異常!");
        }
        else{
        System.out.println(5 / a);
    }
}
}

程序運行結果以下:

異常示例2:

import java.io.*;

public class ExceptionDemo2 {
    public static void main(String args[]) 
     {
          FileInputStream fis=new FileInputStream("text.txt");//JVM自動生成異常對象
          int b;
          while((b=fis.read())!=-1)
          {
              System.out.print(b);
          }
          fis.close();
      }
}

程序中存在文件不能找到的錯誤。修改方法有兩種。

1.用拋出異常方法修改後程序以下:

import java.io.*;

public class ExceptionDemo2 {
    public static void main(String args[]) throws IOException 
     {
          FileInputStream fis=new FileInputStream("text.txt");//JVM自動生成異常對象
          int b;
          while((b=fis.read())!=-1)
          {
              System.out.print(b);
          }
          fis.close();
      }
}

2.將可能出錯代碼放入try子句中程序修改後以下:

import java.io.*;

public class ExceptionDemo2 {
    public static void main(String args[]) {
        FileInputStream fis;
        try {
            fis = new FileInputStream("text.txt");
            // JVM自動生成異常對象
            int b;
            while ((b = fis.read()) != -1) {
                System.out.print(b);
            }
            fis.close();
        } catch (Exception e) {
            // TODO 自動生成的 catch 塊
            e.printStackTrace();
        }
    }
}

 

text文檔中存放以下內容:

程序中以字節流輸出,程序運行結果以下:

實驗2: 導入如下示例程序,測試程序並進行代碼註釋。

測試程序1:

l  在elipse IDE中編輯、編譯、調試運行教材281頁7-1,結合程序運行結果理解程序;

l  在程序中相關代碼處添加新知識的註釋;

l  掌握Throwable類的堆棧跟蹤方法;

程序以下:

import java.util.*;

/**
 * A program that displays a trace feature of a recursive method call.
 * @version 1.01 2004-05-10
 * @author Cay Horstmann
 */
public class StackTraceTest
{
   /**
    * Computes the factorial of a number
    * @param n a non-negative integer
    * @return n! = 1 * 2 * . . . * n
    */
   public static int factorial(int n)//求階乘
   {
      System.out.println("factorial(" + n + "):");
      Throwable t = new Throwable();
      StackTraceElement[] frames = t.getStackTrace();//建立一個表示指定執行點的堆棧跟蹤元素,t存放方法調用棧的信息
      for (StackTraceElement f : frames)
         System.out.println(f);
      int r;
      if (n <= 1) r = 1;
      else r = n * factorial(n - 1);//計算n個數的階乘須要調用以前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);
   }
}

程序運行結果以下:

 

測試程序2:

l  Java語言的異常處理有積極處理方法和消極處理兩種方式;

l  下列兩個簡答程序範例給出了兩種異常處理的代碼格式。在elipse IDE中編輯、調試運行源程序ExceptionalTest.java,將程序中的text文件更換爲身份證號.txt,要求將文件內容讀入內容,並在控制檯顯示;

l  掌握兩種異常處理技術的特色。

程序以下:

1.積極處理方式:

import java.io.*;

class ExceptionTest {
    public static void main (string args[])
   {
       try{
           FileInputStream fis=new FileInputStream("text.txt");
       }
       catch(FileNotFoundExcption e)
        {   ……  }
    ……
    }
}

讀入內容後程序以下:

import java.io.*;

public class desd {
    public static void main(String args[]) {
        FileInputStream fis;
        try {
            fis = new FileInputStream("text.txt");
            int b;
            while ((b = fis.read()) != -1) {
                System.out.print(b);
            }
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.消極處理方式:

import java.io.*;
class ExceptionTest {
    public static void main (string args[]) throws  FileNotFoundExcption
     {
         FileInputStream fis=new FileInputStream("text.txt");
     }
}

讀入內容後程序以下:

import java.io.*;

public class desd {
    public static void main(String args[]) throws IOException 
     {
          FileInputStream fis=new FileInputStream("text.txt");
          int b;
          while((b=fis.read())!=-1)
          {
              System.out.print(b);
          }
          fis.close();
      }
}

 text文件如圖:

 

程序運行結果以下:

 

實驗3: 編程練習

練習1

 編制一個程序,將身份證號.txt 中的信息讀入到內存中;

 按姓名字典序輸出人員信息;

 查詢最大年齡的人員信息;

查詢最小年齡人員信息;

 輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;

 查詢人員中是否有你的同鄉;

 在以上程序適當位置加入異常捕獲代碼。

程序以下:

import java.io.BufferedReader;
        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.util.ArrayList;
        import java.util.Arrays;
        import java.util.Collections;
        import java.util.Scanner;


public class Test{

      private static ArrayList<Person> Personlist1;
       public static void main(String[] args) {
         
          Personlist1 = new ArrayList<>();
         
          Scanner scanner = new Scanner(System.in);
          File file = new File("C:\\Users\\lenovo\\Documents\\身份證");
   
                try {
                     FileInputStream F = new FileInputStream(file);
                     BufferedReader in = new BufferedReader(new InputStreamReader(F));
                     String temp = null;
                     while ((temp = in.readLine()) != null) {
                        
                        Scanner linescanner = new Scanner(temp);
                        
                        linescanner.useDelimiter(" ");    
                        String name = linescanner.next();
                        String id = linescanner.next();
                        String sex = linescanner.next();
                        String age = linescanner.next();
                        String place =linescanner.nextLine();
                        Person Person = new Person();
                        Person.setname(name);
                        Person.setid(id);
                        Person.setsex(sex);
                        int a = Integer.parseInt(age);
                        Person.setage(a);
                        Person.setbirthplace(place);
                        Personlist1.add(Person);

                    }
                } catch (FileNotFoundException e) {
                    System.out.println("查找不到信息");
                    e.printStackTrace();
                } catch (IOException e) {
                    System.out.println("信息讀取有誤");
                    e.printStackTrace();
                }
                boolean isTrue = true;
                while (isTrue) {
                    System.out.println("1:按姓名字典序輸出人員信息;");
                    System.out.println("2:查詢最大年齡與最小年齡人員信息;");
                    System.out.println("3.輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地");
                    System.out.println("4:按省份找你的同鄉;");
                    System.out.println("5:退出");
                    int type = scanner.nextInt();
                    switch (type) {
                    case 1:
                        Collections.sort(Personlist1);
                        System.out.println(Personlist1.toString());
                        break;
                    case 2:
                        
                        int max=0,min=100;int j,k1 = 0,k2=0;
                        for(int i=1;i<Personlist1.size();i++)
                        {
                            j=Personlist1.get(i).getage();
                           if(j>max)
                           {
                               max=j; 
                               k1=i;
                           }
                           if(j<min)
                           {
                               min=j; 
                               k2=i;
                           }

                        }  
                        System.out.println("年齡最大:"+Personlist1.get(k1));
                        System.out.println("年齡最小:"+Personlist1.get(k2));
                        break;
                    case 3:
                        System.out.println("place?");
                        String find = scanner.next();        
                        String place=find.substring(0,3);
                        String place2=find.substring(0,3);
                        for (int i = 0; i <Personlist1.size(); i++) 
                        {
                            if(Personlist1.get(i).getbirthplace().substring(1,4).equals(place)) 
                            {
                                System.out.println("你的同鄉:"+Personlist1.get(i));
                            }
                        } 

                        break;
                    case 4:
                        System.out.println("年齡:");
                        int yourage = scanner.nextInt();
                        int close=ageclose(yourage);
                        int d_value=yourage-Personlist1.get(close).getage();
                        System.out.println(""+Personlist1.get(close));
                  
                        break;
                    case 5:
                   isTrue = false;
                   System.out.println("再見!");
                        break;
                    default:
                        System.out.println("輸入有誤");
                    }
                }
            }
            public static int ageclose(int age) {
                   int m=0;
                int    max=53;
                int d_value=0;
                int k=0;
                for (int i = 0; i < Personlist1.size(); i++)
                {
                    d_value=Personlist1.get(i).getage()-age;
                    if(d_value<0) d_value=-d_value; 
                    if (d_value<max) 
                    {
                       max=d_value;
                       k=i;
                    }

                 }    return k;
                
             }
}
public class Person implements Comparable<Person> {
            private String name;
            private String id;
            private int age;
            private String sex;
            private String birthplace;

    public String getname() {
        return name;
        }
    public void setname(String name) {
        this.name = name;
    }
    public String getid() {
        return id;
    }
    public void setid(String id) {
        this.id= id;
    }
    public int getage() {
    
        return age;
    }
    public void setage(int age) {
        // int a = Integer.parseInt(age);
        this.age= age;
    }
    public String getsex() {
        return sex;
    }
    public void setsex(String sex) {
        this.sex= sex;
    }
    public String getbirthplace() {
        return birthplace;
    }
    public void setbirthplace(String birthplace) {
        this.birthplace= birthplace;
}

    public int compareTo(Person o) {
        return this.name.compareTo(o.getname());

}

    public String toString() {
        return  name+"\t"+sex+"\t"+age+"\t"+id+"\t";

}
}

 

 

練習2

l 編寫一個計算器類,能夠完成加、減、乘、除的操做;

利用計算機類,設計一個小學生100之內數的四則運算練習程序,由計算機隨機產生10道加減乘除練習題,學生輸入答案,由程序檢查答案是否正確,每道題正確計10分,錯誤不計分,10道題測試結束後給出測試總分;

將程序中測試練習題及學生答題結果輸出到文件,文件名爲test.txt

在以上程序適當位置加入異常捕獲代碼。

程序以下:

import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Random;

public class Demo {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        Number counter = new Number();
        PrintWriter out = null;
        try {
            out = new PrintWriter("text.txt");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int sum = 0;

        for (int i = 1; i <= 10; i++) {

            int a = (int) Math.round(Math.random() * 100);
            int b = (int) Math.round(Math.random() * 100);
            int m = (int) Math.round(Math.random() * 3);
            Random n = new Random();

            switch (m) {
            case 0:
                System.out.println(i + ": " + a + "/" + b + "=");

                while (b == 0) {
                    b = (int) Math.round(Math.random() * 100);
                }

                int c = in.nextInt();
                out.println(a + "/" + b + "=" + c);
                if (c == counter.division(a, b)) {
                    sum += 10;
                    System.out.println("恭喜答案正確");
                } else {
                    System.out.println("抱歉,答案錯誤");
                }

                break;

            case 1:
                System.out.println(i + ": " + a + "*" + b + "=");
                int c1 = in.nextInt();
                out.println(a + "*" + b + "=" + c1);
                if (c1 == counter.multiplication(a, b)) {
                    sum += 10;
                    System.out.println("恭喜答案正確");
                } else {
                    System.out.println("抱歉,答案錯誤");
                }
                break;
            case 2:
                System.out.println(i + ": " + a + "+" + b + "=");
                int c2 = in.nextInt();
                out.println(a + "+" + b + "=" + c2);
                if (c2 == counter.add(a, b)) {
                    sum += 10;
                    System.out.println("恭喜答案正確");
                } else {
                    System.out.println("抱歉,答案錯誤");
                }

                break;
            case 3:
                System.out.println(i + ": " + a + "-" + b + "=");
                int c3 = in.nextInt();
                out.println(a + "-" + b + "=" + c3);
                if (c3 == counter.reduce(a, b)) {
                    sum += 10;
                    System.out.println("恭喜答案正確");
                } else {
                    System.out.println("抱歉,答案錯誤");
                }
                break;

            }

        }
        System.out.println("成績" + sum);
        out.println("成績:" + sum);
        out.close();

    }
}

 

 

public class Number {
    private int a;
    private int b;

    public int add(int a, int b) {
        return a + b;
    }

    public int reduce(int a, int b) {
        return a - b;
    }

    public int multiplication(int a, int b) {
        return a * b;
    }

    public int division(int a, int b) {
        if (b != 0)
            return a / b;
        else
            return 0;
    }

}

程序運行結果以下:

 

實驗4:斷言、日誌、程序調試技巧驗證明驗。

實驗程序1

 在elipse下調試程序AssertDemo,結合程序運行結果理解程序;

 註釋語句test1(-5);後從新運行程序,結合程序運行結果理解程序;

 掌握斷言的使用特色及用法。 

public class AssertDemo {
    public static void main(String[] args) {        
        test1(-5);
        test2(-3);
    }
    
    private static void test1(int a){
        assert a > 0;//assert宏的原型定義在<assert.h>中,做用是若是它的條件返回錯誤,則終止程序執行
        System.out.println(a);
    }
    private static void test2(int a){
       assert a > 0 : "這裏出錯了,a不能小於0";
        System.out.println(a);
    }
}

程序運行結果以下:

註釋後程序以下:

public class AssertDemo {
    public static void main(String[] args) {        
       // test1(-5);
        test2(-3);
    }
    
    private static void test1(int a){
        assert a > 0;//assert宏的原型定義在<assert.h>中,做用是若是它的條件返回錯誤,則終止程序執行
        System.out.println(a);
    }
    private static void test2(int a){
       assert a > 0 : "這裏出錯了,a不能小於0";
        System.out.println(a);
    }
}

運行結果:

 

實驗程序2:

l 用JDK命令調試運行教材298-300頁程序7-2,結合程序運行結果理解程序;

l 並掌握Java日誌系統的用途及用法。

程序以下:

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

/**
 * A modification of the image viewer program that logs various events.
 * @version 1.03 2015-08-20
 * @author Cay Horstmann
 */
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);
            });
   }
}

/**
 * 顯示圖像的幀。
 */
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", "<init>");      
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      //設置菜單欄
      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);
            }
         });

      //使用標籤顯示圖像
      label = new JLabel();
      add(label);
      logger.exiting("ImageViewerFrame", "<init>");
   }

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

         //設置文件選擇器
         JFileChooser chooser = new JFileChooser();
         chooser.setCurrentDirectory(new File("."));

         //接受以.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";
               }
            });

         //顯示文件選擇器對話框
         int r = chooser.showOpenDialog(ImageViewerFrame.this);

         // 若是圖像文件被接受,將其設置爲標籤的圖標
         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");
      }
   }
}

/**
 * 用於在窗口中顯示日誌記錄的處理程序。
 */
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();
   }
}

程序運行結果以下:

 

 

 

實驗程序3:

用JDK命令調試運行教材298頁-300頁程序7-2,結合程序運行結果理解程序;

按課件66-77內容練習並掌握Elipse的經常使用調試技術。

程序以下:

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

/**
 * A modification of the image viewer program that logs various events.
 * @version 1.03 2015-08-20
 * @author Cay Horstmann
 */
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);
            });
   }
}

/**
 * 顯示圖像的幀。
 */
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", "<init>");      
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

      //設置菜單欄
      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);
            }
         });

      //使用標籤顯示圖像
      label = new JLabel();
      add(label);
      logger.exiting("ImageViewerFrame", "<init>");
   }

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

         //設置文件選擇器
         JFileChooser chooser = new JFileChooser();
         chooser.setCurrentDirectory(new File("."));

         //接受以.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";
               }
            });

         //顯示文件選擇器對話框
         int r = chooser.showOpenDialog(ImageViewerFrame.this);

         // 若是圖像文件被接受,將其設置爲標籤的圖標
         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");
      }
   }
}

/**
 * 用於在窗口中顯示日誌記錄的處理程序。
 */
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();
   }
}

1)條件斷點(有必定條件的斷點):在Eclipse Java 編輯區的行頭雙擊就會獲得一個斷點,代碼會運行到此處時中止。

在斷點處點擊鼠標右鍵,選擇最後一個「Breakpoint Properties」。

2)變量斷點:在變量的值初始化,或是變量值改變時能夠中止。

3)方法斷點:方法斷點就是將斷點打在方法的入口處。

4)異常斷點:當異常發生時,代碼會停在異常發生處。

5)從新調試:回退時,請在須要回退的線程方法上點右鍵,選擇「Drop to Frame」。

6)單步執行程序 

7)檢查變量

8)改變變量值

三:實驗總結。

       這周主要學習了程序產生的異常以及如何解決程序中產生的異常。異常時在程序的執行過程當中所發生的非正常事件,它中斷指令的正常執行。所以在編寫代碼時須要及時處理這些錯誤。對於異常處理,在理論課上聽的不是很明白,但在實驗課上經過學長演示程序,用拋出異常和將可能出錯的語句放入try子句中兩種方法,基本理解了異常的產生的緣由和解決方法。但對於斷言以及日誌等內容,仍是不明白,本身在課後看了課本內容,但也仍是不太理解。所以在運行後面幾個相關程序時,對程序不是很理解。但願在以後的課堂上,老師能再講解一下,本身也會多練習程序去了解這些知識。

相關文章
相關標籤/搜索