201771010102 常惠琢 《2018面向对象程序设计(Java)》第9周学习总结
實驗九?異常、斷言與日志
實驗時間?2018-10-25
1、實驗目的與要求
(1)?掌握java異常處理技術;
(2)?了解斷言的用法;
(3)?了解日志的用途;
(4)?掌握程序基礎調試技巧;
2、實驗內容和步驟
實驗1:用命令行與IDE兩種環境下編輯調試運行源程序ExceptionDemo1、ExceptionDemo2,結合程序運行結果理解程序,掌握未檢查異常和已檢查異常的區別。
| //異常示例1 public?class?ExceptionDemo1?{ public?static?void?main(String?args[])?{ int?a?=?0; 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(); ??????} } |
?
實驗2:?導入以下示例程序,測試程序并進行代碼注釋。
測試程序1:
l?在elipse?IDE中編輯、編譯、調試運行教材281頁7-1,結合程序運行結果理解程序;
l?在程序中相關代碼處添加新知識的注釋;
l?掌握Throwable類的堆棧跟蹤方法
package stackTrace;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 非負整數的PARAM * @return n! = 1 * 2 * . . . * 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);} }?
測試程序2:
l?Java語言的異常處理有積極處理方法和消極處理兩種方式;
l?下列兩個簡答程序范例給出了兩種異常處理的代碼格式。在elipse?IDE中編輯、調試運行源程序ExceptionalTest.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"); ?????} } |
實驗3:?編程練習
練習1:
l?編制一個程序,將身份證號.txt?中的信息讀入到內存中;
l?按姓名字典序輸出人員信息;
l?查詢最大年齡的人員信息;
l?查詢最小年齡人員信息;
l?輸入你的年齡,查詢身份證號.txt中年齡與你最近人的姓名、身份證號、年齡、性別和出生地;
l?查詢人員中是否有你的同鄉;
l?在以上程序適當位置加入異常捕獲代碼。
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<Student> studentlist;public static void main(String[] args) {studentlist = new ArrayList<>();Scanner scanner = new Scanner(System.in);File file = new File("F:\\java\\身份證號.txt");try {FileInputStream fis = new FileInputStream(file);BufferedReader in = new BufferedReader(new InputStreamReader(fis));String temp = null;while ((temp = in.readLine()) != null) {Scanner linescanner = new Scanner(temp);linescanner.useDelimiter(" "); String name = linescanner.next();String number = linescanner.next();String sex = linescanner.next();String age = linescanner.next();String province =linescanner.nextLine();Student student = new Student();student.setName(name);student.setnumber(number);student.setsex(sex);int a = Integer.parseInt(age);student.setage(a);student.setprovince(province);studentlist.add(student);}} catch (FileNotFoundException e) {System.out.println("找不到學生的信息文件");e.printStackTrace();} catch (IOException e) {System.out.println("學生信息文件讀取錯誤");e.printStackTrace();}boolean isTrue = true;while (isTrue) {System.out.println("選擇你的操作, ");System.out.println("1.字典排序 ");System.out.println("2.輸出年齡最大和年齡最小的人 ");System.out.println("3.尋找同鄉 ");System.out.println("4.尋找年齡相近的人 ");System.out.println("5.退出 ");String m = scanner.next();switch (m) {case "1":Collections.sort(studentlist); System.out.println(studentlist.toString());break;case "2":int max=0,min=100;int j,k1 = 0,k2=0;for(int i=1;i<studentlist.size();i++){j=studentlist.get(i).getage();if(j>max){max=j; k1=i;}if(j<min){min=j; k2=i;}} System.out.println("年齡最大:"+studentlist.get(k1));System.out.println("年齡最小:"+studentlist.get(k2));break;case "3":System.out.println("地址?");String find = scanner.next(); String place=find.substring(0,3);for (int i = 0; i <studentlist.size(); i++) {if(studentlist.get(i).getprovince().substring(1,4).equals(place)) System.out.println("同鄉"+studentlist.get(i));} break;case "4":System.out.println("年齡:");int yourage = scanner.nextInt();int near=agenear(yourage);int value=yourage-studentlist.get(near).getage();System.out.println(""+studentlist.get(near));break;case "5 ":isTrue = false;System.out.println("退出程序!");break;default:System.out.println("輸入有誤");}}}public static int agenear(int age) { int j=0,min=53,value=0,ok=0;for (int i = 0; i < studentlist.size(); i++){value=studentlist.get(i).getage()-age;if(value<0) value=-value; if (value<min) {min=value;ok=i;} } return ok; }} public class Student implements Comparable<Student> {private String name;private String number ;private String sex ;private int age;private String province;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getnumber() {return number;}public void setnumber(String number) {this.number = number;}public String getsex() {return sex ;}public void setsex(String sex ) {this.sex =sex ;}public int getage() {return age;}public void setage(int age) {// int a = Integer.parseInt(age);this.age= age;}public String getprovince() {return province;}public void setprovince(String province) {this.province=province ;}public int compareTo(Student o) {return this.name.compareTo(o.getName());}public String toString() {return name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n";} }注:以下實驗課后完成
練習2:
l?編寫一個計算器類,可以完成加、減、乘、除的操作;
l?利用計算機類,設計一個小學生100以內數的四則運算練習程序,由計算機隨機產生10道加減乘除練習題,學生輸入答案,由程序檢查答案是否正確,每道題正確計10分,錯誤不計分,10道題測試結束后給出測試總分;
l?將程序中測試練習題及學生答題結果輸出到文件,文件名為test.txt;
l?在以上程序適當位置加入異常捕獲代碼。
package 異常;import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.Scanner;public class Demo {public static void main(String[] args, Object jf) {@SuppressWarnings("resource")Scanner in = new Scanner(System.in);jf counter=new jf();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);switch(m){case 0:System.out.println(i+": "+a+"/"+b+"=");while(b==0){ b = (int) Math.round(Math.random() * 100); }int c0 = in.nextInt();out.println(a+"/"+b+"="+c0);if (c0 == ((異常.jf) jf).division(a, b)) {sum += 10;System.out.println("恭喜答案正確");}else {System.out.println("抱歉,答案錯誤");}break;case 1:System.out.println(i+": "+a+"*"+b+"=");int c = in.nextInt();out.println(a+"*"+b+"="+c);if (c == counter.multiplication(a, b)) {sum += 10;System.out.println("恭喜答案正確");}else {System.out.println("抱歉,答案錯誤");}break;case 2:System.out.println(i+": "+a+"+"+b+"=");int c1 = in.nextInt();out.println(a+"+"+b+"="+c1);if (c1 == counter.add(a, b)) {sum += 10;System.out.println("恭喜答案正確");}else {System.out.println("抱歉,答案錯誤");}break ;case 3:System.out.println(i+": "+a+"-"+b+"=");int c2 = in.nextInt();out.println(a+"-"+b+"="+c2);if (c2 == counter.reduce(a, b)) {sum += 10;System.out.println("恭喜答案正確");}else {System.out.println("抱歉,答案錯誤");}break ;} }System.out.println("成績"+sum);out.println("成績:"+sum);out.close();}} package 異常;public class jf {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:
| //斷言程序示例 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); ????} } |
在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;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);} }實驗程序2:
l?用JDK命令調試運行教材298頁-300頁程序7-2,結合程序運行結果理解程序;
l?并掌握Java日志系統的用途及用法。
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger;import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem;/*** 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", "<init>"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);// set up menu barJMenuBar 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 imageslabel = new JLabel();add(label);logger.exiting("ImageViewerFrame", "<init>");}private class FileOpenListener implements ActionListener{public void actionPerformed(ActionEvent event){logger.entering("ImageViewerFrame.FileOpenListener", "actionPerformed", event);// set up file chooserJFileChooser chooser = new JFileChooser();chooser.setCurrentDirectory(new File("."));// accept all files ending with .gifchooser.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 dialogint r = chooser.showOpenDialog(ImageViewerFrame.this);// if image file accepted, set it as icon of the labelif (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");}} } 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);});} } import java.util.logging.LogRecord; import java.util.logging.StreamHandler;import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea;import org.omg.CORBA.Any; import org.omg.CORBA.Object; import org.omg.CORBA.TypeCode; import org.omg.CORBA.portable.InputStream; import org.omg.CORBA_2_3.portable.OutputStream;/*** 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 calledpublic void write(byte[] b, int off, int len){output.append(new String(b, off, len));}@Overridepublic InputStream create_input_stream() {// TODO Auto-generated method stubreturn null;}@Overridepublic void write_Object(Object arg0) {// TODO Auto-generated method stub }@Overridepublic void write_TypeCode(TypeCode arg0) {// TODO Auto-generated method stub }@Overridepublic void write_any(Any arg0) {// TODO Auto-generated method stub }@Overridepublic void write_boolean(boolean arg0) {// TODO Auto-generated method stub }@Overridepublic void write_boolean_array(boolean[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_char(char arg0) {// TODO Auto-generated method stub }@Overridepublic void write_char_array(char[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_double(double arg0) {// TODO Auto-generated method stub }@Overridepublic void write_double_array(double[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_float(float arg0) {// TODO Auto-generated method stub }@Overridepublic void write_float_array(float[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_long(int arg0) {// TODO Auto-generated method stub }@Overridepublic void write_long_array(int[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_longlong(long arg0) {// TODO Auto-generated method stub }@Overridepublic void write_longlong_array(long[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_octet(byte arg0) {// TODO Auto-generated method stub }@Overridepublic void write_octet_array(byte[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_short(short arg0) {// TODO Auto-generated method stub }@Overridepublic void write_short_array(short[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_string(String arg0) {// TODO Auto-generated method stub }@Overridepublic void write_ulong(int arg0) {// TODO Auto-generated method stub }@Overridepublic void write_ulong_array(int[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_ulonglong(long arg0) {// TODO Auto-generated method stub }@Overridepublic void write_ulonglong_array(long[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_ushort(short arg0) {// TODO Auto-generated method stub }@Overridepublic void write_ushort_array(short[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_wchar(char arg0) {// TODO Auto-generated method stub }@Overridepublic void write_wchar_array(char[] arg0, int arg1, int arg2) {// TODO Auto-generated method stub }@Overridepublic void write_wstring(String arg0) {// TODO Auto-generated method stub }});}public void publish(LogRecord record){if (!frame.isVisible()) return;super.publish(record);flush();}}? ? ?
實驗總結:
第7章? 異常、日志、斷言和調試:
?概念:異常、異常類型、異常聲明、異常拋出、 異常捕獲
?異常處理技術
?斷言的概念及使用
?基本的調試技巧
一、異常的概念:
Java的異常處理機制可以控制程序從錯誤產生的 位置轉移到能夠進行錯誤處理的位置。 ?
程序中出現的常見的錯誤和問題有:
用戶輸入錯誤
設備錯誤
物理限制
代碼錯誤
二、異常分類:
?Java把程序運行時可能遇到的錯誤分為兩類:
1、非致命異常:通過某種修正后程序還能繼續執行。 這類錯誤叫作異常。如:文件不存在、無效的數組 下標、空引用、網絡斷開、打印機脫機、磁盤滿等。 Java中提供了一種獨特的處理異常的機制,通過異 常來處理程序設計中出現的錯誤。
2、致命異常:程序遇到了非常嚴重的不正常狀態,不 能簡單恢復執行,是致命性錯誤。如:內存耗盡、 系統內部錯誤等。這種錯誤程序本身無法解決。
?Java中所有的異常類都直接或間接地繼承于 Throwable類。除內置異常類外,程序員可自定義異 常類。 ?
3、Java中的異常類可分為兩大類:
-Error Error類層次結構描述了Java運行時系統的內部錯誤 和資源耗盡錯誤。應用程序不應該捕獲這類異常,也 不會拋出這種異常。
-Exception Exception類:重點掌握的異常類。Exception層次結 構又分解為兩個分支:一個分支派生于 RuntimeException;另一個分支包含其他異常。
4、RuntimeException為運行時異常類,一般是程序錯誤 產生。 ?
派生于RuntimeException的異常包含下面幾種情況:
–錯誤的類型轉換 –數組訪問越界
–訪問空指針
–Java將派生于Error類或RuntimeException類的所有異 常稱為未檢查異常,編譯器允許不對它們做出異常處 理。
注意:“如果出現RuntimeException異常,就一定是程序員 的問題!!!”
5、非運行時異常,程序本身沒有問題,但由于某種情 況的變化,程序不能正常運行,導致異常出現。 ?除了運行時異常之外的其它繼承自Exception類的 異常類包括:
–試圖在文件尾部后面讀取數據 –試圖打開一個錯誤格式的URL
–編譯器要求程序必須對這類異常進行處理 (checked),稱為已檢查異常。
RuntimeException: 運行時異常類
–ArithmeticException: 算術異常類
–ArrayStoreException: 數組存儲異常類
–ClassCastException: 類型強制轉換異常類
–IndexOutOfBoundsException: 下標越界異常類
–NullPointerException: 空指針異常類
–SecurityException: 違背安全原則異常類
IOException:輸入輸出異常類
–IOException:申請I/O操作沒有正常完成。
–EOFException:在輸入操作正常結束前遇見了 文件結束符。
–FileNotFountException:在文件系統中,沒有找到由文件名字符串指定的文件。
小結:異常類型:
? ? 1>.Error 很難恢復的嚴重錯誤,一般不由程序處理。
?2>.RuntimeException 程序設計或實現上的問題,如數組越界等。
?3>.其它異常 通常是由環境因素引起的,并且可以被處理。 如文件不存在,無效URL等。
轉載于:https://www.cnblogs.com/hongyanohongyan/p/9851808.html
總結
以上是生活随笔為你收集整理的201771010102 常惠琢 《2018面向对象程序设计(Java)》第9周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: npm指南
- 下一篇: Linux apache源码安装自定义S