201871010114-李巖鬆《面向對象程序設計(java)》第十週學習總結

項目html

內容java

這個做業屬於哪一個課程程序員

https://www.cnblogs.com/nwnu-daizh/編程

這個做業的要求在哪裏數組

https://www.cnblogs.com/nwnu-daizh/p/11435127.htmlapp

做業學習目標less

1.掌握java異常處理技術;dom

2.瞭解斷言的用法;編程語言

3.瞭解日誌的用途;ide

4.掌握程序基礎調試技巧。

 

第一部分:總結第七章關於異常處理相關理論知識

 

 

 

 

1.1 異常概念

異常,就是不正常的意思。在生活中:醫生說,你的身體某個部位有異常,該部位和正常相比有點不一樣,該部位的功能將受影響.在程序中的意思就是:

  異常 :指的是程序在執行過程當中,出現的非正常的狀況,最終會致使JVM的非正常中止

在Java等面向對象的編程語言中,異常自己是一個類,產生異常就是建立異常對象並拋出了一個異常對象。Java處理異常的方式是中斷處理。

異常指的並非語法錯誤,語法錯了,編譯不經過,不會產生字節碼文件,根本不能運行.

1.2 異常體系

異常機制實際上是幫助咱們找到程序中的問題,異常的根類是 java.lang.Throwable ,其下有兩個子類:java.lang.Error 與 java.lang.Exception ,日常所說的異常指 java.lang.Exception 。

 

 

 

Throwable體系:

  Error:嚴重錯誤Error,沒法經過處理的錯誤,只能事先避免,比如絕症。

  Exception:表示異常,異常產生後程序員能夠經過代碼的方式糾正,使程序繼續運行,是必需要處理的。比如感冒、闌尾炎。

Throwable中的經常使用方法:

public void printStackTrace() :打印異常的詳細信息。

包含了異常的類型,異常的緣由,還包括異常出現的位置,在開發和調試階段,都得使用printStackTrace

public String getMessage() :獲取發生異常的緣由。

提示給用戶的時候,就提示錯誤緣由。

public String toString() :獲取異常的類型和異常描述信息(不用)。

 出現異常,沒關係張,把異常的簡單類名,拷貝到API中去查。

 

 

 

1.3 異常分類

 咱們日常說的異常就是指Exception,由於這類異常一旦出現,咱們就要對代碼進行更正,修復程序。

異常(Exception)的分類:根據在編譯時期仍是運行時期去檢查異常?

  編譯時期異常:checked異常。在編譯時期,就會檢查,若是沒有處理異常,則編譯失敗。(如日期格式化異常)

  運行時期異常:runtime異常。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數學異常)

 

1.4         異常的產生過程解析

 先運行下面的程序,程序會產生一個數組索引越界異常ArrayIndexOfBoundsException。咱們經過圖解來解析下異常產生的過程。

 

public class ArrayTools {

//    對給定的數組經過給定的角標獲取元素。

public static int getElement(int[] arr, int index) { int element = arr[index];

return element;

}

}

工具類

ublic class ExceptionDemo {

public static void main(String[] args) {

int[] arr = { 34, 12, 67 };

intnum = ArrayTools.getElement(arr, 4)

System.out.println("num=" + num);

System.out.println("over");

}

}

上述程序執行過程圖解:

 

 

 第二章 異常的處理

 

Java異常處理的五個關鍵字:trycatchfinallythrowthrows

 

2.1 拋出異常throw

 

在編寫程序時,咱們必需要考慮程序出現問題的狀況。好比,在定義方法時,方法須要接受參數。那麼,當調用方法使用接受到的參數時,首先須要先對參數數據進行合法的判斷,數據若不合法,就應該告訴調用者,傳遞合法的數據進來。這時須要使用拋出異常的方式來告訴調用者。

 java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象。那麼,拋出一個異常具體如何操做呢?

 1.建立一個異常對象。封裝一些提示信息(信息能夠本身編寫)

 2.須要將這個異常對象告知給調用者。怎麼告知呢?怎麼將這個異常對象傳遞到調用者處呢?經過關鍵字throw就能夠完成。throw 異常對象。throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,

並結束當前方法的執行。

 使用格式:

throw new 異常類名(參數);

例如:

throw new NullPointerException("要訪問的arr數組不存在");

throw new ArrayIndexOutOfBoundsException("該索引在數組中不存在,已超出範圍");

咱們經過下面程序演示下throw的使用。

public class ThrowDemo {

public static void main(String[] args) {

//建立一個數組

int[] arr = {2,4,52,2};

//根據索引找對應的元素

int index = 4;

int element = getElement(arr, index);

System.out.println(element);

System.out.println("over");

}

/*

*    根據 索引找到數組中對應的元素

*/

public static int getElement(int[] arr,int index){

//判斷    索引是否越界

if(index<0 || index>arr.length‐1){

/*

判斷條件若是知足,當執行完throw拋出異常對象後,方法已經沒法繼續運算。

這時就會結束當前方法的執行,並將異常告知給調用者。這時就須要經過異常來解決。

*/

throw new ArrayIndexOutOfBoundsException("哥們,角標越界了~~~");

}

int element = arr[index];

return element;

}

}

2.3 聲明異常throws

聲明異常:將問題標識出來,報告給調用者。若是方法內經過throw拋出了編譯時異常,而沒有捕獲處理(稍後講解該方式),那麼必須經過throws進行聲明,讓調用者去處理。

 關鍵字throws運用於方法聲明之上,用於表示當前方法不處理異常,而是提醒該方法的調用者來處理異常(拋出異常).

 聲明異常格式:

修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2…{    }

聲明異常的代碼演示:

public class ThrowsDemo {

public static void main(String[] args) throws FileNotFoundException { read("a.txt");

}

//    若是定義功能時有問題發生須要報告給調用者。能夠經過在方法上使用throws關鍵字進行聲明 public static void read(String path) throws FileNotFoundException {

if (!path.equals("a.txt")) {//若是不是 a.txt這個文件

//    我假設 若是不是 a.txt 認爲 該文件不存在 是一個錯誤 也就是異常 throw

throw new FileNotFoundException("文件不存在");

}

}

}

throws用於進行異常類的聲明,若該方法可能有多種異常狀況產生,那麼在throws後面能夠寫多個異常類,用逗號隔開。

public class ThrowsDemo2 {

public static void main(String[] args) throws IOException { read("a.txt");

}

public static void read(String path)throws FileNotFoundException, IOException { if (!path.equals("a.txt")) {//若是不是 a.txt這個文件

//    我假設 若是不是 a.txt 認爲 該文件不存在 是一個錯誤 也就是異常 throw throw new FileNotFoundException("文件不存在");

}

if (!path.equals("b.txt")) {

throw new IOException();

}

}

}

2.4 捕獲異常try…catch

 

若是異常出現的話,會馬上終止程序,因此咱們得處理異常:

1. 該方法不處理,而是聲明拋出,由該方法的調用者來處理(throws)

2. 在方法中使用try-catch的語句塊來處理異常。

try-catch的方式就是捕獲異常。

 捕獲異常:Java中對異常有針對性的語句進行捕獲,能夠對出現的異常進行指定方式的處理。

 

捕獲異常語法以下:

try{

編寫可能會出現異常的代碼

}catch(異常類型    e){

處理異常的代碼

//記錄日誌/打印異常信息/繼續拋出異常

}

try:該代碼塊中編寫可能產生異常的代碼。

 

catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。

 

注意:trycatch都不能單獨使用,必須連用。

 

 

演示以下:

public class TryCatchDemo {

public static void main(String[] args) {

try {// 當產生異常時,必須有處理方式。要麼捕獲,要麼聲明。

read("b.txt");

} catch (FileNotFoundException e) {// 括號中須要定義什麼呢?

//try中拋出的是什麼異常,在括號中就定義什麼異常類型

System.out.println(e);

}

System.out.println("over");

}

/*

*

*    咱們 當前的這個方法中 有異常 有編譯期異常

*/

public static void read(String path) throws FileNotFoundException { if (!path.equals("a.txt")) {//若是不是 a.txt這個文件

//    我假設 若是不是 a.txt 認爲 該文件不存在 是一個錯誤 也就是異常 throw throw new FileNotFoundException("文件不存在");

}
}

}

 

1、實驗目的與要求

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

(2) 瞭解斷言的用法;

(3) 瞭解日誌的用途;

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

2、實驗內容和步驟

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

package week11.test;

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

運行結果:

 

 

 

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();
      }
}

運行結果:

 

 

 

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

測試程序1:

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

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

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

package week11.test;

import java.util.*;

/**
 * A program that displays a trace feature of a recursive method call.
 * @version 1.10 2017-12-14
 * @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)
   {
//調用Throwable類的getStackTrace方法訪問棧堆軌跡的文本描述信息

System.out.println("factorial("+n+"):");

Throwable t=new Throwable();
 StackTraceElement[] frames=t.getStackTrace(); for(StackTraceElement f:frames)//遍歷fames數組 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); } }

 

運行結果:

 

 

測試程序2:

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

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

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

 

//積極處理方式  

import java.io.*;

 

class ExceptionTest {

    public static void main (string args[])

   {

       try{

           FileInputStream fis=new FileInputStream("text.txt");

       }

       catch(FileNotFoundExcption e)

        {   ……  }

    ……

    }

}

//消極處理方式

 

import java.io.*;

class ExceptionTest {

    public static void main (string args[]) throws  FileNotFoundExcption

     {

        FileInputStream fis=new FileInputStream("text.txt");

     }

}

 
 

//積極處理
import java.io.*;
class ExceptionDemo1 {
public static void main (String args[])
{
File fis=new File("身份證號.txt");
try{

 
 

FileReader fr = new FileReader(fis);
BufferedReader br = new BufferedReader(fr);
try {
String s, s2 = new String();
while ((s = br.readLine()) != null) {
s2 += s + "\n ";
}
br.close();
System.out.println(s2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

 

//消極處理方式

import java.io.*;
class ExceptionDemo1 {
    public static void main (String args[]) throws  IOException
       {
        File fis=new File("身份證號.txt");
        FileReader fr = new FileReader(fis);
        BufferedReader br = new BufferedReader(fr);
        String s, s2 = new String();

            while ((s = br.readLine()) != null) {
                s2 += s + "\n ";
            }
            br.close();
            System.out.println(s2);
       }
}

 

運行結果:

積極處理方式:

 

 消極處理方式:

 

 

實驗3: 編程練習

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

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

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

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

注:如下實驗課後完成

package week11.test;

public class Calculation {
    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 mutli(int a,int b)
    {
        return a*b;
    }
    public int division(int a,int b)
    {
        if(b!=0)
        {
            return a/b;
        }
        return 0;
    }


}
package week11.test;

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

public class CaclusionTest {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        Calculation  result=new Calculation();
        PrintWriter out=null;
        try {
                out=new  PrintWriter("test.txt");
        }catch(FileNotFoundException e) {
        
         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==result.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==result.mutli(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==result.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==result.reduce(a,b)) {
                sum+=10;
                System.out.println("回答正確");
            }else {
                System.out.println("回答錯誤");
            }
            break;
           }
        }
        System.out.println("你的總分是:"+sum);
        out.println("成績:"+sum);
        out.close();
        
    }
}
        

 

 

 

運行結果:

 

 

 

 

 

 

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

實驗程序1:

//斷言程序示例

public class AssertDemo {

    public static void main(String[] args) {       

        test1(-5);

        test2(-3);

    }

   

    private static void test1(int a){

        assert a > 0;

        System.out.println(a);

    }

    private static void test2(int a){

       assert a > 0 : "something goes wrong here, a cannot be less than 0";

        System.out.println(a);

    }

}

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

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

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

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)
            {
            } 

            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:

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

l  按課件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)改變變量值

實驗總結:在本週學習了程序產生的異常以及如何解決程序中產生的異常。異常時在程序的執行過程當中所發生的非正常事件,它中斷指令的正常執行。所以在編寫代碼時須要及時處理這些錯誤。基本理解了異常的產生的緣由和解決方法。但對於斷言以及日誌等內容不太理解。所以在運行後面幾個相關程序時,對程序不是很理解。之後本身也會多練習程序去了解這些知識。

獲獎感想與Java階段性學習總結

獲獎感想

  • 對於期中考試後得到小黃衫倍感意外,學習java的過程剛開始是很枯燥的,但慢慢的發現其中的一些樂趣之後,就可以慢慢的去發現去探索各類java程序的應用,更是感謝助教牛百泉學長每週五堅持開直播 爲咱們答疑解惑,經過實踐來讓咱們掌握學習內容,更沒有想到通過本身不懈的努力,我亦有榮幸得到一件屬於個人小黃衫。
  • 收穫這份殊榮,喜悅之餘我也感到了很大的壓力。其一,小黃衫不但意味着代老師對我現階段學習態度的確定,也意味着更高的指望,想要不辜負這份指望與鞭策,就要繼續努力作到更好。其二,小黃衫的得到者,不管是助教牛百泉學長,仍是本學期的前幾位同窗,都是很是值得學習的人,他們的每週的博客園寫的很是好,對於知識點的總結更是十分細心,之後應該更應該向他們學習,若是不更加堅實本身的腳步,最終仍是會落後於別人,後面學習要更加的認真才能夠。

階段性總結

一、自主學習

從這門課程一開始,代就給我傳遞了自主學習的思想。它不一樣於咱們以往接受的填鴨式教學,而是以你本身爲主導去學習。這樣的學習方式中,你要本身分配時間,本身查找資料,在mooc中先完成自學,在代老師的課堂上不少疑惑就會感受到迎刃而解,同時遇到問題要本身動手解決。如同字面意思同樣,在一次又一次的」doing「中,你的知識概念從模糊到清晰。起初或許會感到有些麻煩,但你會真切的感到本身能力的提升,真正的嘗試思考,每一點成果都有你的思考,而且經過實踐掌握的語法點更加牢固。

二、多加練習

掌握了基本的語法點之後更重要的是去不斷地練習,只有不斷地去寫程序,咱們才能感覺到java語言的好處,和這個語法點在實際中不一樣的用途,同時遇到問題時,咱們不要急於求助他人,必定要先想一想本身能夠怎樣解決,實踐中出現的問題每每能夠經過新的實踐來找到解決的辦法。但當你遇到瓶頸,機關用盡時,不妨聽聽別人的思路,或者上CSDN、博客園上找找答案,或許會給你的一些啓發。就在這樣不斷的發現問題,解決問題中,咱們會迭代式的獲得提高。

三、貴在堅持

編程沒有捷徑,只有不斷地堅持,才能得到更好的提高,要合理規劃好本身的學習任務,在前半學期仍是缺乏合理規劃,自主學習時間缺乏堅持,後面階段的學習要堅持練習。

相關文章
相關標籤/搜索