201871020225- 뮤 흥원 "객체 지향 프로그래밍 (자바)"열 번째 주 학습 요약

201871020225- 뮤 흥원 "객체 지향 프로그래밍 ( 자바),"열 번째 주 학습 요약

처음에 보웬 텍스트 :

계획

함유량

이 작품은 과정 속

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

어디에서 작업이 요구 사항

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

작업 학습 목표

(1) 마스터 자바 예외 처리 기술;

(2) 사용의 주장을 이해;

(3) 로그의 목적을 이해;

(4) 염기성 프로그램 디버깅 기술 마스터;

에세이 보웬의 텍스트 내용 :

I 부 : 제 VII은 예외 처리에 대한 관련 이론적 지식을 요약

1. 처리 오류

오류 유형 :

(1) 사용자 입력 에러;

(2) 장치 오류;

(3) 물리적 한계;

(4) 코드 오류

2. 이상

( 1 ) 정의 : 무슨 일이 있었는지에 프로그램의 실행 중에 특별한 이벤트는,이 지침의 정상적인 실행을 중단합니다. 예외 개체로부터 유래되는 클래스의 Throwable 인스턴스.

( 2 ) 카테고리 : 모든 예외 클래스 출신 오류 (치명적 오류) 및 예외 (치명적 오류) : 두 가지로의 Throwable, 다음 층에서 상속.

( 3 ) 디자인 할 때 자바 프로그램,주의 예외 계층 구조. 예외 계층 구조와 두 가지로 분해 : 말고 RuntimeException에서 파생 된 가지, 가지 다른 이상이 포함되어 있습니다. RuntimeException의 예외 클래스는 일반적으로 프로그램 오류가 발생, 실행 중입니다.

(3) 에서 파생 된 의 RuntimeException 예외는 다음과 같은 경우를 포함한다 :

( 1) 오류 캐스트

( 2) 바운드 어레이 액세스 중

( 3) 액세스 널 포인터

주 : Java 클래스가 체크되지 않은 예외라고 모든 예외의 출생에 대한 에러 나 RuntimeException의 클래스를 보낼 것입니다, 컴파일러는 그 예외 처리를 할 수 없습니다.

4. 예외를 발생 : throws 절 나타내는 예외 문을 던져의 방법에.

( . 1) 같은 시간에 절은 예외 처리, 이러한 설명은 생략한다 여러 예외를 지정할 수 있습니다 던져,하지만 던져 그.

( 2) 방법이 이상하거나 통제 할 수없는 (오류)가없는 체크 된 예외를 던질 수있는 모든 방법을 선언해야합니다, 또는 (RuntimeException을)를 피해야한다. 메소드가 체크 된 예외의 발생 가능한 모든 선언되지 않은 경우, 컴파일러는 오류 메시지를 줄 것이다.

( 3) 예외 객체 throw 문에 의해 달성된다 던진다.

5. 예외 클래스를 작성합니다.

사용자 정의 예외 클래스 : 파생 정의 예외의 직접 또는 간접적으로 서브 클래스를. 파생 클래스로 IOException가.

6. 캐치 예외 :

( 1) 캡처 단계 예외 시도는 {} 코드 드로 명령문의 시도 블록에 의해 정의 된 선택된 코드 범위 포착 절 예외에 오브젝트의 실행시 자동으로 생성 될 수있다.

( 2) 캐치 절 : 캐치 예외 코드 블록을 처리 대상이고;

   . 각 코드 블록은 블록 생성 시도 다른 종류의 예외가 이벤트를 처리하기위한 하나 이상의 catch 문을 동반 할 수 시도;

 b.catch 문은,이 클래스 예외의 Throwable, 시스템 매개 변수의 값 예외 객체가 런타임에 발생합니다 catch 블록에 전달의 서브 클래스해야이 객체 클래스를 캡처 할 수 있습니다 비정상적인 형태를 나타내는 하나의 매개 변수가 필요합니다;

 Throwa 예외 객체 클래스를 호출하여 블록 c.catch.

   의 getMessage은 : 비정상적인 이벤트에 대한 정보를 얻기 위해 사용;

   printStackTrace에은 : 비정상적인 이벤트가 발생할 때 실행 스택의 내용을 추적하는 데 사용.

7. 스택 추적 : 메서드 호출의 프로그램 실행 프로세스의 목록, 그것은 프로그램 실행 메서드 호출시 특정 위치를 포함합니다.

두 가지 경우 프로그램 예외 처리 코드 :

( 1) 긍정적 인 접근 방식을 : 캡처해야 예외를 처리하는 방법을 정확하게 알고;

( 2) 부정적인 접근 방식 : 던져 예외를 처리하는 방법을 모르겠어요.

파트 II : 실험 부분

실험 1 : 편집 및 디버깅 소스 코드 ExceptionDemo1 명령 줄에서 실행 환경을 모두 IDE는 ExceptionDemo2, 프로그램은 체크 이해하는 프로그램의 결과와 마스터되지 않은 예외과 차이점 이상과 함께 실행됩니다.

// 이상 실시 예 1

공공  클래스  ExceptionDemo1 {

공공  정적  무효  메인 (문자열 인수 []) {

INT의  A = 0;

체계. 아웃 .println (5 / a);

}

}

// 예 2 개 이상

수입  는 java.io *;

 

공공  클래스  ExceptionDemo2 {

공공  정적  무효  메인 (문자열 인수 [])

     {

          FIS는 FileInputStream에 = 새로운 새로운  FileInputStream에 ( "텍스트 . TXT를" ) ; // JVM이 예외 객체가 자동으로 생성

          INT의  B;

          반면 ((b = FIS .read () ) =! - 1)

          {

              체계. 아웃 .print (b);

          }

          FIS .close () ;

      }

}

특정 코드는 다음과 같이 :

 //异常示例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  导入以下示例程序,测试程序并进行代码注释。

实验2:测试程序1

1elipse IDE中编辑、编译、调试运行教材281页7-1,结合程序运行结果理解程序;

2在程序中相关代码处添加新知识的注释;

3掌握Throwable类的堆栈跟踪方法;

具体代码如下:

  1 package stackTrace;
2
3 import java.util.*;
4
5 /**
6  * A program that displays a trace feature of a recursive method call.
7  * @version 1.10 2017-12-14
8  * @author Cay Horstmann
9  */
10 public class StackTraceTest
11 {
12    /**
13     * Computes the factorial of a number
14     * @param n a non-negative integer
15     * @return n! = 1 * 2 * . . . * n
16     */
17    public static int factorial(int n)    //求阶乘
18    {   //调用Throwable类的getStackTrace方法访问栈堆轨迹的文本描述信息
19       System.out.println("factorial(" + n + "):");
20       var walker = StackWalker.getInstance(); //创建对象时调用堆栈的跟踪
21       walker.forEach(System.out::println);    //调用对象walker的foreach循环  
22       int r;
23       if (n <= 1) r = 1;
24       else r = n * factorial(n - 1);     //计算n的阶乘需要去调用n-1的阶乘
25       System.out.println("return " + r);
26       return r;
27    }
28
29    public static void main(String[] args)
30    {
31       try (var in = new Scanner(System.in))
32       {
33          System.out.print("Enter n: ");
34          int n = in.nextInt();
35          factorial(n);
36       }
37    }
38 }

运行结果如下:

 

 

 

实验2:测试程序2

1Java语言的异常处理有积极处理方法和消极处理两种方式;

2下列两个简单程序范例给出了两种异常处理的代码格式。在elipse IDE中编辑、调试运行源程序ExceptionTest.java,将程序中的text文件更换为身份证号.txt,要求将文件内容读入内容,并在控制台显示;

3掌握两种异常处理技术的特点。

//积极处理方式  

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");

     }

}

积极处理具体代码如下:

 1 import java.io.*;
2
3 class ExceptionTest { 4     public static void main (String args[])
5    {
6        
7        try{
8            FileInputStream fis=new FileInputStream("D://身份证号.txt");
9            BufferedReader in = new BufferedReader(new InputStreamReader(fis));
10            String s = new String();
11            while ((s = in.readLine()) != null) {
12                System.out.println(s);
13            }
14            in.close();
15            fis.close();
16        }
17        catch (FileNotFoundException e) {
18            System.out.println("文件未找到");
19 e.printStackTrace(); 20        } catch (IOException e) {
21            System.out.println("文件读取错误");
22            e.printStackTrace();
23        }
24 }
25 }

消极处理具体代码如下:

 1 import java.io.*;
2
3 public class ExceptionTest { 4     public static void main (String args[]) throws IOException
5    {
6         
7        try{
8            FileInputStream fis=new FileInputStream("D://身份证号.txt");
9            BufferedReader in = new BufferedReader(new InputStreamReader(fis));
10            String s = new String();
11            while ((s = in.readLine()) != null) {
12                System.out.println(s);
13            }
14            in.close();
15            fis.close();
16          
17        }
18        finally {
19         return ;
20        }
21       
22    }
23 }

运行结果如下:

 

 

 

实验3:编程练习

1编写一个计算器类,可以完成加、减、乘、除的操作;

2利用计算机类,设计一个小学生100以内数的四则运算练习程序,由计算机随机产生10道加减乘除练习题,学生输入答案,由程序检查答案是否正确,每道题正确计10分,错误不计分,10道题测试结束后给出测试总分;

3将程序中测试练习题及学生答题结果输出到文件,文件名为test.txt;

4在以上程序适当位置加入异常捕获代码。

具体代码如下:

 

 
package test;
import java.util.Random;
import java.util.Scanner;
public class test{
int sum;
public static void main(String[] args) {
test t=new test();
System.out.println("本次测试共十道题,每题十分,满分一百分");
t.sum=0;
Random r=new Random();
for(int i=0;i<10;i++) {
t.core();
}
System.out.println("考试结束");
System.out.println("你的总分为"+t.sum);
}
private void core() {
Random r=new Random();
int m,n;
m=r.nextInt(11);
n=m%4;
switch(n) {
case 0:
int a ,b,c;
a=r.nextInt(101);
b=r.nextInt(101);
System.out.println(a+"+"+"("+b+")"+"=");
Scanner x=new Scanner(System.in);
c=x.nextInt();
if(c!=a+b)
System.out.println("回答错误");
else {
System.out.println("回答正确");
sum=sum+10;
}
break;
case 1:
int h,g,f;
h=r.nextInt(101);
g=r.nextInt(101);
System.out.println(h+"-"+"("+g+")"+"= ");
Scanner u=new Scanner(System.in);
f=u.nextInt();
if(f!=h-g)
System.out.println("回答错误");
else {
System.out.println("回答正确");
sum=sum+10;
}
break;
case 2:
int q,w,e;
q=r.nextInt(101);
w=r.nextInt(101);
System.out.println(q+"*"+"("+w+")"+"= ");
  Scanner y=new Scanner(System.in);
e=y.nextInt();
if(e!=q*w)
System.out.println("回答错误");
else {
System.out.println("回答正确");
sum=sum+10;
}
break;
case 3:
double j,k,l;
j=r.nextInt(101);
k=r.nextInt(101);
if(k==0)
k++;
System.out.println(j+"/"+"("+k+")"+"= ");
Scanner z=new Scanner(System.in);
l=z.nextDouble();
if(l!=(j/k)/1.00)
System.out.println("回答错误");
else {
System.out.println("回答正常");
sum=sum+10;
}
break;
}
}
}
 

运行结果如下:

 

 

 

 

 

实验4  断言、日志、程序调试技巧验证实验。

实验4:测试程序1

1elipse下调试程序AssertDemo,结合程序运行结果理解程序;

2注释语句test1(-5);后重新运行程序,结合程序运行结果理解程序;

3掌握断言的使用特点及用法。

//断言程序示例

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

    }

}

 

运行结果如下:

 

 

 

 

 打开断言:

 

 

实验4:测试程序2

1JDK命令调试运行教材298页-300页程序7-2,结合程序运行结果理解程序;

2并掌握Java日志系统的用途及用法。

具体代码如下:

 

 

运行结果如下:

 

实验4:测试程序3

1JDK命令调试运行教材298页-300页程序7-2,结合程序运行结果理解程序;

2按课件66-77内容练习并掌握Elipse的常用调试技术。

具体代码如下:

 package logging;
 
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);
            });
   }
}
 
/**
 * 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 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", "<init>");
   }
 
   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
-

运行结果如下:

 

 

 

第三部分:实验总结

       这一周学习了程序运行过程中产生的异常和处理异常的方法,断言,日志。异常时在程序的执行过程中很常见。因此在编写代码时需要及时处理这些错误。异常的抛出,断言,刚接触时不太能理解,但是通过课后作业和mooc的学习,有了进一步的认识,并且在测试程序和自主编程的练习中体会新知识的应用,知道了一些异常情况的基本处理方式,对于异常有了更深刻的了解,我也将会在后来的实践及学习中多多了解。 

 

추천

출처www.cnblogs.com/muxingyuan/p/11794929.html