GVKun编程网logo

狄慧 201771010104《面向对象程序设计(java)》第九周学习总结(面向对象程序设计java答案)

4

想了解狄慧201771010104《面向对象程序设计的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java》第九周学习总结的相关问题,此外,我们还将为您介绍关于201653012017-2

想了解狄慧 201771010104《面向对象程序设计的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于java》第九周学习总结的相关问题,此外,我们还将为您介绍关于20165301 2017-2018-2 《Java程序设计》第九周学习总结、2017-2018-2 20179204《网络攻防实践》第九周学习总结、20172313 2018-2019-1 《程序设计与数据结构》第九周学习总结、20172325 2017-2018-2 《Java程序设计》第九周学习总结的新知识。

本文目录一览:

狄慧 201771010104《面向对象程序设计(java)》第九周学习总结(面向对象程序设计java答案)

狄慧 201771010104《面向对象程序设计(java)》第九周学习总结(面向对象程序设计java答案)

实验九异常、断言与日志

实验时间 2018-10-25

一、知识点总结:

(一)处理错误:

1、可能出现的问题获错误:

用户输入错误、设备错误、物理限制、代码错误。

2、异常具有自己的语法和特定的继承结构:

异常分类:异常对象都是派生于 Throwable 类的一个实例,但在下一层立即分为两个支:Error 和 Exception。

(二)异常分类:

1. 非致命异常: 通过某种修正后程序还能继续执行。 这类错误叫作异常。如:文件不存在、无效的数组 下标、空引用、网络断开、打印机脱机、磁盘满等。 Java 中提供了一种独特的处理异常的机制,通过异 常来处理程序设计中出现的错误。

2. 致命异常:程序遇到了非常严重的不正常状态,不 能简单恢复执行,是致命性错误。如:内存耗尽、 系统内部错误等。这种错误程序本身无法解决。

3. Java 中所有的异常类都直接或间接地继承于 Throwable 类。除内置异常类外,程序员可自定义异 常类。

Java 中的异常类可分为两大类:

1>.Error Error 类层次结构描述了 Java 运行时系统的内部错误 和资源耗尽错误。应用程序不应该捕获这类异常,也 不会抛出这种异常。

2>.Exception Exception 类:重点掌握的异常类。Exception 层次结 构又分解为两个分支:一个分支派生于 RuntimeException;另一个分支包含其他异常

 

(三)声明受查异常:如果遇到无法处理的情况,Java 方法可以抛出一个异常,不仅要告诉编辑器将要返回什么值,还要告诉编辑器有可能发生什么错误。方法应该在其首部声明可能发生的所有异常,遇到以下四种情况时应该抛出异常:1 调用一个抛出受查异常的方法;2 程序运行过程中发现错误,并且利用 throw 语句抛出一个受查异常;3 程序出现错误;4Java 虚拟机和运行时库出现的内部错误。

(四)如何抛出异常:首先要决定应该抛出什么类型的异常。对于一个已经存在的异常类,将其抛出十分容易。在这种情况下:1 找到一个合适的异常类 2 创建这个类的一个对象 3 将对象抛出。一旦方法抛出了异常,这个方法就不可能返回到调用者。

(五)创建异常类:定义一个派生于 Exception(或子类)的类。

 

二、实验

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

      }

}

public class ExceptionDemo1 {

    public static void main(String[] args) {
        int a = 0;
        if(a==0) {
            System.out.println("除数为零");
        }
        else
        {
            System.out.println(5 / a);
        }
        
    }

}

import java.io.*;

public class ExceptionDemo2{ 
    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) {
              // TODO Auto-generated catch block
              e.printStackTrace();//打印堆栈信息
//            System.out.println("Hello.");
        }//JVM自动生成异常对象
     }
}

实验 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非负整数
    * @return n! = 1 * 2 * . . . * n
    */
   public static int factorial(int n)//静态类阶乘
   {
      System.out.println("factorial(" + n + "):");//输出要阶乘的数n
      Throwable t = new Throwable();//将抛出异常赋值给t
      StackTraceElement[] frames = t.getStackTrace();//把抛出的堆栈轨迹t赋值给要素frames多窗口页面
      for (StackTraceElement f : frames)
         System.out.println(f);
      int r;
      if (n <= 1) r = 1;//如果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);
   }
}
//堆栈先进后出,最后进入factorial(1),同样先出进行运算
View Code
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非负整数
    * @return n! = 1 * 2 * . . . * n
    */
   public static int factorial(int n)//静态类阶乘
   {
      System.out.println("factorial(" + n + "):");//输出要阶乘的数n
      Throwable t = new Throwable();//将抛出异常赋值给t
      StackTraceElement[] frames = t.getStackTrace();//把抛出的堆栈轨迹t赋值给要素frames多窗口页面
      for (StackTraceElement f : frames)
         System.out.println(f);
      int r;
      if (n <= 1) r = 1;//如果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);
   }
}
//堆栈先进后出,最后进入factorial(1),同样先出进行运算

测试程序 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");

       }

       catchFileNotFoundExcption e)

        {   ……  }

    ……

    }

}

// 消极处理方式

 

import java.io.*;

class ExceptionTest {

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

     {

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

     }

}

//积极处理方式  
import java.io.*;
import java.io.BufferedReader;
import java.io.FileReader;
class ExceptionTest {
    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) {
               e.printStackTrace();
           }
       }catch(FileNotFoundExcption e)
       {
           e.printStackTrace(); 
       }
    }
}
//消极处理方式

import java.io.*;
class ExceptionTest1 {
    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: 编程练习

练习 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 A{
    private static ArrayList<Test> studentlist;
    public static void main(String[] args) {
        studentlist = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        File file = new File("D:\\身份证号.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();
                Test student = new Test();
                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("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("province?");
                 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("province"+studentlist.get(i));
                 }             
                 break;
                 
            case "4":
                System.out.println("年龄:");
                int yourage = scanner.nextInt();
                int near=agematched(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 agematched(int age) {      
        int j=0,min=53,value=0,k=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;
                k=i;
             } 
          }    
         return k;         
      }

}
public  class Test implements Comparable<Test> {

    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) {
           
        this.age= age;
        }

    public String getprovince() {
        return province;
    }
    public void setprovince(String province) {
        this.province=province ;
    }

    public int compareTo(Test 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  在以上程序适当位置加入异常捕获代码。

import java.util.Random;
import java.util.Scanner;

import java.io.FileNotFoundException;

import java.io.PrintWriter;

public class math{
    public static void main(String[] args)
    {
        
        yunsuan counter=new yunsuan();//与其它类建立联系
    PrintWriter out=null;
    try {
        out=new PrintWriter("D:/text.txt");
         
    }catch(FileNotFoundException e) {
        e.printStackTrace();
    }
    int sum=0;

    for(int i=0;i<10;i++)
    {
    int a=new Random().nextInt(100);
    int b=new Random().nextInt(100);
    Scanner in=new Scanner(System.in);
    //in.close();
    
    switch((int)(Math.random()*4))
    
    {
    
    case 0:
        System.out.println( ""+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 1:
        if(a<b)
                        {
                                 int temp=a;
                                 a=b;
                                 b=temp;
                             }//为避免减数比被减数大的情况

         System.out.println(""+a+"-"+b+"=");
         /*while((a-b)<0)
         {  
             b = (int) Math.round(Math.random() * 100);
             
         }*/
        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 ;
    
      

    
    case 2:
        
         System.out.println(""+a+"*"+b+"=");
        int c = in.nextInt();
        out.println(a+"*"+b+"="+c);
        if (c == counter.multiply(a, b)) {
            sum += 10;
            System.out.println("答案正确");
        }
        else {
            System.out.println("答案错误");
        }
        break;
    case 3:
        
        
        System.out.println(""+a+"/"+b+"=");
        while(b==0)
        {  b = (int) Math.round(Math.random() * 100);
        }
     int c0= in.nextInt();
     out.println(a+"/"+b+"="+c0);
     if (c0 == counter.devision(a, b)) {
         sum += 10;
         System.out.println("答案正确");
     }
     else {
         System.out.println("答案错误");
     }
    
     break;
     

    }
    }
    System.out.println("totlescore:"+sum);
    out.println(sum);
    
    out.close();
    }
    }
//import java.util.Random;

public class yunsuan{
    //int a=new Random().nextInt(100);
    //int b=new Random().nextInt(100);
    
    public int add(int a,int b)
    {
        return a+b;
    }
    public int reduce(int a,int b)
    {
        if((a-b)>0)
        return a-b;
        else return 0;
    }
    public int multiply(int a,int b)
    {
        return a*b;
    }
    public int devision(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);

    }

}

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

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

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

实验程序 2:

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

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

实验程序 3:

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

l  按课件 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
         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();
   }
}

三、实验总结:

       在本周的实验中,我学习了解了几种异常处理的方法,通过实验,我已经掌握了处理异常的方法,并能够在程序中恰当的位置添加 try、catch 语句,但是在写程序的过程中多多少少还是会遇到一些问题,在后面会多加练习的。

20165301 2017-2018-2 《Java程序设计》第九周学习总结

20165301 2017-2018-2 《Java程序设计》第九周学习总结

20165301 2017-2018-2 《Java程序设计》第九周学习总结

教材学习内容总结

第十三章:Java网络编程

  • URL类

    • 通常包含三部分信息:协议、地址、资源
    • 协议必须是URL对象所在的Java虚拟机支持的协议
    • 地址必须是能连接的有效的IP地址或域名;
    • 资源可以是主机上的任何一个文件
  • InetAddress类

    • 表示地址的方式:域名、IP地址
    • InetAddress类的方法:
    • getByName(String s)将域名或IP地址传给该方法的参数s,获得InetAddress对象
    • public String getHostName()获取InetAddress对象包含的域名
    • public String getHostAddress()获取IP地址
    • getLocalHost()获取含有本机域名和IP地址的对象
  • UDP数据报

    • 基本通信模式:将数据打包,发往目的地;接受数据包,查看内容
    • 发送数据包:
DatagramPacket(byte data[],int length,InetAddtress address,int port)
DatagramPack(byte data[],int offset,int length,InetAddtress address,int port)
DatagramSocket mail_out=new DatagramSocket(); 
mail_out.send(data_pack);

代码托管

  • statistics.sh脚本的运行结果截图

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 11/11 1/1 4/4
第二周 286/297 2/3 6/10
第三周 722/1004 1/4 10/20
第四周 421/1425 1/5 10/30
第五周 829/2283 3/8 10/40
第六周 943/3326 2/10 10/50
第七周 497/3823 1/11 10/60
第八周 703/4527 3/14 15/75
第九周 1569/6096 2/16 25/90

2017-2018-2 20179204《网络攻防实践》第九周学习总结

2017-2018-2 20179204《网络攻防实践》第九周学习总结

第1节 教材学习内容总结

本周学习了教材第九、十章的内容。

###1.1 恶意代码安全攻防 第九章介绍了恶意代码的基础知识。

  • 恶意代码指的是使计算机按照攻击者的意图执行以达到恶意目的的指令集。

  • 恶意代码包括计算机病毒、蠕虫、后门、木马等种类。

  • 恶意代码的分析方法,包括静态分析和动态分析。静态分析的方法有反病毒软件扫描、二进制结构分析、反汇编反编译、代码结构与逻辑分析等方法;动态分析的方法有系统动态行为监控、网络协议栈监控、沙箱技术、动态调试技术等。

  • 教材介绍了一些实践的实例。

###1.2 缓冲区溢出和Shellcode 第十章介绍了缓冲区溢出和Shellcode。

  • 首先教材介绍了何为软件安全漏洞。 软件安全漏洞包括系统的脆弱性或缺陷、攻击者对缺陷的可访问性和攻击者对缺陷的可利用性三个元素。

  • 软件安全具有复杂性、可扩展性、连通性。软件安全漏洞有以下几类,有内存安全违规类、输入验证类、竞争条件类、权限混淆与提升类。

  • 缓冲区溢出的概念,即在计算机程序向特定缓冲区内填充数据时,超出了缓冲区本身的容量,导致外溢数据覆盖了相邻内存空间的合法数据,从而改变了程序执行流程破坏系统运行完整性。

  • Linux和Windows平台上的栈溢出和Shellcode,并介绍了相关的攻击技术。堆溢出是缓冲区溢出的第二种类型的攻击方案,比栈溢出更加复杂。

  • 缓冲区溢出的防御技术,有尝试杜绝溢出、允许溢出但不让程序改变执行流程、无法让攻击代码执行三种方法。

第2节 kali视频(36-38)学习

###36.Kali压力测试工具 压力测试通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能够提供的最大的服务级别的测试。通俗地讲,压力测试是为了测试应用程序的性能会变得不可接受。

Kali下压力测试工具包含VoIP压力测试、Web压力测试、网络压力测试及无线压力测试。

  • Voip压力测试工具

包括iaxflood和inviteflood

  • web压力测试工具

THC-SSL-DOS

借助THC-SSL-DOS攻击工具,任何人都可以把提供SSL安全连接的网站攻击下线,这种攻击方法称为SSL拒绝服务攻击(SSL-DOS)。

德国黑客组织发布THC SSL DOS,利用SSL中已知的弱点,迅速耗费服务器资源,与传统DDoS工具不同的是,它不需要任何带宽,只需要一台执行单一攻击的电脑。

漏洞存在于协议的renegotiation过程中,renegotiation被用于浏览器到服务器之间的验证。

  • 网络压力测试工具

dhcpig :耗尽DHCP资源池的压力测试。

  • ipv6攻击工具包
  • Inundator

IDS/IPS/WAF 压力测试工具

  • Macof

可做泛洪攻击

  • Siege

Siege是一个压力测试和评测工具,设计用于Web开发,评估应用在压力下的承受能力,可以根据配置对一个Web站点进行多用户的并发访问,记录每个用户所有请求过程的响应时间,并在一定数量的并发访问下重复进行。

  • T50压力测试

功能强大,且具有独特的数据包注入工具,T50支持 nix系统,可进行多种协议数据包注入,实际上支持15种协议。

  • 无线压力测试

包括MDK3和Reaver

###37.数字取证工具 数字取证技术将计算机调查和分析技术应用于潜在的、有法律效力的电子证据的确定与获取,同样他们都是针对黑客和入侵的,目的都是保障网络安全。

  • PDF取证工具

pdf-parser和peepdf

peepdf是一个使用python编写的PDF文件分析工具,它可以检测到恶意的PDF文件。其设计目标是为安全研究人员提供PDF分析中可能用到的所有组件。

  • 反数字取证chkrootkit

Linux系统下查找rootkit后门工具。判断系统是否被植入Rootkit的利器。

  • 内存取证工具

Volatility是开源的Windows、Linux、Mac、Android的内存取证分析工具,由python编写成,命令行操作,支持各种操作系统。

  • 取证分析工具binwalk

Binwalk是一个固件的分析工具,旨在协助研究人员对固件分析,提取及逆向工程。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,更重要的一点是可以轻松扩展。

借助binwalk中的一个很强大的功能——提取文件(压缩包)中的隐藏文件(或内容文件)。亦可分析文件格式。 分析压缩包 binwalk *.zip。

binwalk -e *.zip 将文件全部解压,产生新的目录_zip.zip.extracted,还可以作为文件格式分析的工具。

  • 取证哈希验证工具集

md5deep是一套跨平台的方案,可以计算和比较MD5等哈希加密信息的摘要MD5,SHA-1,SHA-256,Tiger,Whirlpool。

  • 取证镜像工具集

针对镜像文件的取证工具,如mmsstat与mmls等命令。

  • 数字取证套件

数字取证工具

数字取证套件

1)autopsy 2)DFF(Digital Forensics Framework)是一个简单但强大的数字取证工作辅助工具,它具有灵活的模块系统,具有多种功能,包括:回复错误或崩溃导致的文件丢失,证据的研究和分析。DFF提供了一个强大的体系结构和一些列有用的模块。

3)反数字取证chkrootkit

###38.Kali报告工具与系统服务 一次完整的渗透测试,最后要完成一份报告作为一个小结。相应的,Kali Linux为安全工程师准备了报告工具集:documentation、媒体捕捉、证据管理。

系统服务:beef、dradis、http、metasploit、mysql、openvas、ssh。

  • Dradis

Dradis用于提高安全检测效率的信息共享框架(协作平台)。Dradis提供了一个集中的信息仓库,用于标记我们目前已经做的工作和下一步计划。基于浏览器的在线笔记。

  • keepnote精简的笔记本软件

特点如下:

  富文本格式——彩色字体、内置图片、超链接,能保存网页图片文字等完整内容。
  树形分层组织内容,分门别类,一目了然。
  全文搜索
  综合截图
  文件附件
  集成的备份和恢复
  拼写检查(通过gtkspell)
  自动保存
  内置的备份和恢复(zip文件存档)
  • 媒体捕捉工具Cutycapt

将网页内容截成图片保存。

  • Recordmydesktop

屏幕录像工具

  • 证据管理

Maltego Casefile

  • MagicTree

是一个面向渗透测试人员的工具,可以帮助攻击者进行数据合并、查询、外部命令执行(比如直接调用nmap)和报告生成。所有数据都会以树形结构存储,非常方便。

  • Truectypt

免费开源的加密软件,同时支持Windows,OS,Linux等操作系统。

  • 系统服务介绍

    	BeEF:对应XSS测试框架BeEF的启动与关闭;
    	Dradis:对应笔记分享服务Dradis的启动与关闭;
    	HTTP:对用Kali本机Web服务的启动与关闭;
    	Metasploit:对应Metasploit服务的启动与关闭;
    	Mysql:对应Mysql服务的启动与关闭;
    	Openvas:对应Openvas服务的启动与关闭;
    	SSH:对应SSH服务的启动与关闭;(远程连接最好不要开启)
    

20172313 2018-2019-1 《程序设计与数据结构》第九周学习总结

20172313 2018-2019-1 《程序设计与数据结构》第九周学习总结

20172313 2018-2019-1 《程序设计与数据结构》第九周学习总结

教材学习内容总结

###无向图

  • 无向图:与树类似,图也由结点和这些结点之间的连接构成。这些结点是顶点,而结点之间的链接是边。无向图是一种边为无序结点对的图。于是,记做(A,B)的边就意味着A与B之间有一条从两个方向都可以游历的连接。边记作(A,B)和记作(B,A)的含义是完全一样的。
    • 如果图中的两个顶点之间有一条连通边,则称这两个顶点是邻接的。邻接顶点有时也称为邻居
    • 联通一个顶点及其自身的边称为自循环

上图中,A和B邻接,而A和D不邻接。边(A,A)表示的是连接A到自身的一个环。

  • 完全图:如果一个无向图含有最多条边,那么它为完全图。例如:
    • 完全图有n(n-1)条边。(此时假设没有边自循环。
    • 连接图中两个顶点的边的序列,可以由多条边组成。(图中的路径是双向的。
    • 路径长度:路径中所含边的数目(顶点个数减1)。
  • 连通图:无向图中任意两个顶点之间都存在一条路径。(完全图一定是连通图,连通图不一定是完全图。
  • 环路:一种首顶点和末顶点相同且没有重边的路径。
  • 无环图:没有环路的图。
  • 无向图是一种连通的无环无向图,其中一个元素被指定为树根。

有向图

  • 有向图:又称双向图,是一种边为有序顶点对的图。(边(A,B)和边(B,A)方向不同)
  • 有向路径:连接两个顶点有向边的序列。
  • 注意:注意连通图的有向图和无向图之间的不同:
    • 上图第一个图是连通的,第二个图并不是连通的,因为没有任何路径能从其他顶点游历到顶点A。
  • 拓扑序:有向图中没有环路,且有一条从A到B的边,则可以吧顶点A安排在顶点B之前,这种排列得到的顶点次序。
  • 有向树是一个有向图,其中指定一个元素为根,则具有下列特性:
    • 不存在其他顶点到树根的连接。
    • 每个非树根元素恰好有一个连接。
    • 树根到每个其他顶点都有一条路径。

网络

  • 网络:又称加权图,每条边都对应一个权值(数据信息)的图,可以是有向的也可以是无向的。(城市之间的航线、票价等)
    • 网络的边由起始顶点、终止定点和权重构成的三元组来表示。

常用的图算法

  • 深度优先遍历:和树的先序遍历比较类似。假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
    • 无向图示例如下:
      • ①访问A。
      • ②访问(A的邻接点)C。在第1步访问A之后,接下来应该访问的是A的邻接点,即"C,D,F"中的一个。但在本文的实现中,顶点ABCDEFG是按照顺序存储,C在"D和F"的前面,因此,先访问C。
      • ③访问(C的邻接点)B。 在第2步访问C之后,接下来应该访问C的邻接点,即"B和D"中一个(A已经被访问过,就不算在内)。而由于B在D之前,先访问B。
      • ④访问(C的邻接点)D。在第3步访问了C的邻接点B之后,B没有未被访问的邻接点;因此,返回到访问C的另一个邻接点D。
      • ⑤访问(A的邻接点)F。前面已经访问了A,并且访问完了"A的邻接点B的所有邻接点(包括递归的邻接点在内)";因此,此时返回到访问A的另一个邻接点F。
      • ⑥访问(F的邻接点)G。
      • ⑦访问(G的邻接点)E。
      • 因此访问顺序是:A -> C -> B -> D -> F -> G -> E
    • 有向图示例如下:
      • ①访问A。
      • ②访问B。在访问了A之后,接下来应该访问的是A的出边的另一个顶点,即顶点B。
      • ③访问C。在访问了B之后,接下来应该访问的是B的出边的另一个顶点,即顶点C,E,F。在本文实现的图中,顶点ABCDEFG按照顺序存储,因此先访问C。
      • ④访问E。接下来访问C的出边的另一个顶点,即顶点E。
      • ⑤访问D。接下来访问E的出边的另一个顶点,即顶点B,D。顶点B已经被访问过,因此访问顶点D。
      • ⑥访问F。接下应该回溯"访问A的出边的另一个顶点F"。
      • ⑦访问G。
      • 因此访问顺序是:A -> B -> C -> E -> D -> F -> G
  • 广度优先遍历
    • 又称为"宽度优先搜索"或"横向优先搜索",简称BFS。从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2...的顶点。
    • 无向图示例如下:
      • ①访问A。
      • ②依次访问C,D,F。在访问了A之后,接下来访问A的邻接点。前面已经说过,在本文实现中,顶点ABCDEFG按照顺序存储的,C在"D和F"的前面,因此,先访问C。再访问完C之后,再依次访问D,F。
      • ③依次访问B,G。在第2步访问完C,D,F之后,再依次访问它们的邻接点。首先访问C的邻接点B,再访问F的邻接点G。
      • ④访问E。在第3步访问完B,G之后,再依次访问它们的邻接点。只有G有邻接点E,因此访问G的邻接点E。
      • 因此访问顺序是:A -> C -> D -> F -> B -> G -> E
    • 有向图示例如下:
      • ①访问A。
      • ②访问B。
      • ③依次访问C,E,F。在访问了B之后,接下来访问B的出边的另一个顶点,即C,E,F。前面已经说过,在本文实现中,顶点ABCDEFG按照顺序存储的,因此会先访问C,再依次访问E,F。
      • ④依次访问D,G。在访问完C,E,F之后,再依次访问它们的出边的另一个顶点。还是按照C,E,F的顺序访问,C的已经全部访问过了,那么就只剩下E,F;先访问E的邻接点D,再访问F的邻接点G。
      • 因此访问顺序是:**A -> B -> C -> E -> F -> D -> G **
    • 测试连通性:从任意结点开始的广度优先遍历中得到的顶点数等于图中所含顶点数。
  • 最小生成树
    • 生成树:生成树是一棵含有图中所有顶点和部分边(但可能不是所有边)的树。
    • 最小生成树:所含边权值之和小于其他生成树的边的权值之和。计算最小生成树一般有两种算法:Kruskal和Prim算法
      • Kruskal算法:此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。具体操作如下:
        • ① 把图中的所有边按代价从小到大排序;
        • ② 把图中的n个顶点看成独立的n棵树组成的森林;
        • ③ 按权值从小到大选择边,所选的边连接的两个顶点ui,vi,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。
        • ④重复③,直到所有顶点都在一颗树内或者有n-1条边为止。

  • Prim算法:此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,直到最小生成树含有原始图的所有顶点时结束。具体操作如下:
    • ①图的所有顶点集合为V;初始令集合u={s},v=V−u;
    • ②在两个集合u,v能够组成的边中,选择一条代价最小的边(u0,v0),加入到最小生成树中,并把v0并入到集合u中。
    • ③重复上述步骤,直到最小生成树有n-1条边或者n个顶点为止。

  • 判断最短路径
    • 第一种方法:判定起始顶点和目标顶点之间是否存在最短路径(两个顶点之间边数最少的路径)。
    • 第二种方法:Dijkstra算法:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。具体操作如下;
      • ①初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
      • ②从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
      • ③以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
      • ④重复步骤b和c直到所有顶点都包含在S中。
    • 示例如下,求从顶点v1到其他各个顶点的最短路径   首先第一步,我们先声明一个dis数组,该数组初始化的值为:   这时顶点集合S中只有一个元素:S={v1},既然是求V1顶点到其余各个顶点的最短路径,那么我们就先找到V1能够直接到达的点,从图中可知是V2和V3,我们把dis[m]设为从顶点d[0]处到V(m+1)的路径查毒,同时把所有其他(顶点不能直接到达的)顶点的路径长度设为无穷大。这时在数组中表示就为dis[1]=12,dis[2]=6。因为目前离 v1顶点最近的是 v3顶点,并且这个图所有的权重都是正数,所以不可能通过第三个顶点中转,这时V1到V3的最短路程就是dis[2]值。将V3加入S中。   我们现在已经确定了一个点的最短路径,下面我们来看V3能到哪些点,从图中看V3只能到V5且V1——V3——V5的距离为17,显而易见要比∞要小,所以数组更新如下。   此时V1和V3都已经存入S中,我们又从除dis[2]和dis[0]外的其他值中寻找最小值,此时dis[1]最小,同理,V1到V2的最短距离就是dis[1]的值,将V2加入U中,从图中看V2能到V3和V4,前面分析过,V1到V3的距离是最短的,所以不再看V2到V4,V1——V2——V4的距离为15,显而易见要比∞要小,所以数组更新如下。   此时V1、V2、V3都已经存入S中,我们又从除dis[0]、dis[1]、dis[2]外的其他值中寻找最小值,此时dis[3]最小,将V4加入U中,从图中看V4只能到V5,有前面可知V1——V4的最短距离为15,所以V1——V4——V5的距离为16,比17小,所以对dis[4]进行替换 ,数组更新如下 然后再次寻找最小值,将V5加入U中,计算完毕。

图的实现策略

  • 邻接列表:将每个顶点的邻接点串成一个单链表。
  • 邻接矩阵: 逻辑结构分为两部分:Vexs[](存储顶点)和Arcs[][](邻接矩阵)集合。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。无向图的邻接矩阵示例如下:

教材学习中的问题和解决过程

  • 问题1:在学习教材的时候,最小生成树的方法中有这样一行代码“resultGraph[][] = Double.Positive_INFINITY”,不是很理解这里的POSITIVE_INFINITY代表什么意思。
  • 问题1解决方案:我们首先来思考这样一个问题,在进行浮点数运算的时候,有时我们会遇到除数为0的情况,那我们该如何解决呢?所以引入了无限这个概念,POSITIVE_INFINITY正是可以用来代表无限。示例如下
double i = Double.POSITIVE_INFINITY;   // i表示为无限大

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
  • 问题2:不是很理解求最短路径时的Dijkstra算法。
  • 问题2解决方案:前文有详细叙述。
  • 问题3:不是很理解求最小生成树的Prim算法。
  • 问题3解决方案:前文有详细叙述。

代码调试中的问题和解决过程

  • 问题1:在做pp15_1的时候,对方法进行测试,陷入了死循环。
  • 问题1解决方案:首先,我先要确定是哪个方法导致了死循环,由于我调用了toString方法,但屏幕上并没有出现任何数值,这就说明要么是toString出现了问题,要么在它之前就出现了错误。从前往后分析,把所有的操作都注释掉,依次判断,发现了一个奇怪的现象,当第一次调用addEdge方法的时候是不会出现死循环的,在第二次的时候才会出现。虽然不知道具体在哪个地方出现了问题,但可以肯定的确是addEdge出了毛病。用debug对代码进行分析之后发现了问题,由于邻接列表的数据结构,利用列表中的元素的指针指向其他元素的时候不能直接指向该列表中的元素,而是要用一个temp的其值进行储存,再用指针指向它,这样问题就得以解决了。
  • 问题2:在做pp15_7计算带权重的有向图的最短路径的时候无法得到期望值。
  • 问题2解决方案:在输入的时候我想获得A到C的权重和最小的路径,却得到的值为49。因为我的思路是把原先判断两个顶点之间是否有边的adjMatrix的数组改成了存放两顶点之间边权重的数组。如果两顶点之间没有边,将边的值设置为-1,如果有边但没有存权重就把它设置为无穷大。出现的值是49,可能是因为在计算的时候加上了-1,所以我就想应该要在哪里添加判断条件。   我在上图所示的地方加上了判断条件,但结果并没有发生改变。判断条件是temp < dist[j],为dis[]加限定条件只是限制了数组值的范围,并不会导致出现49的情况。还要对adjMaxtrix[][]进行限制。如下图所示,问题就得以解决了
for (int j = 0; j < numVertices; j++) {
                if (adjMatrix[k][j] != -1&&dist[j]!= -1) {
                    double temp = (adjMatrix[k][j] == Double.POSITIVE_INFINITY
                            ? Double.POSITIVE_INFINITY : (min + adjMatrix[k][j]));
                    if (flag[j] == false && (temp < dist[j])) {
                        dist[j] = temp;
                        previous[j] = k;
                    }
                }
            }

代码托管

上周考试错题总结

  这周没有错题哦~

结对及互评

  • 博客中值得学习的或问题:
    • 排版精美,对教材的总结细致,善于发现问题,对于问题研究得很细致,解答也很周全。
  • 代码中值得学习的或问题:
    • 代码写的很规范,思路很清晰,继续加油!

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172332
    • 20172326
    • 结对学习内容
      • 第15章 图

其他(感悟、思考等,可选)

  刚刚感觉上周的内容简单了一些,本章的内容又给了我一闷棍,本章的难度不仅难在算法的理解上,还难在代码的实现上,光是学习算法就花费了不少时间,关键代码的理解也不容易。但这周学下来总体上说收获还是挺大的,这周的学习状态也还算可以,希望自己能够继续保持这样的状态,继续进步吧!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
第一周 200/200 1/1 5/20
第二周 981/1181 1/2 15/20
第三周 1694/2875 1/3 15/35
第四周 3129/6004 1/4 15/50
第五周 1294/7298 1/5 15/65
第六周 1426/8724 1/6 20/85
第七周 2071/10795 1/7 20/105
第八周 3393/14188 1/8 20/125
第九周 3217/17045 1/9 20/145
  • 计划学习时间:20小时

  • 实际学习时间:20小时

参考资料

  • 【数据结构】图的存储方式:邻接矩阵和邻接表
  • 图的遍历之 深度优先搜索和广度优先搜索
  • 数据结构 JAVA描述(七) 图的遍历+最小生成树
  • 图的五种最短路径算法

20172325 2017-2018-2 《Java程序设计》第九周学习总结

20172325 2017-2018-2 《Java程序设计》第九周学习总结

20172325 2017-2018-2 《Java程序设计》第九周学习总结

教材学习内容总结

异常

1.学习了异常的基本概念; 2.区分异常与错误:

  • 一个异常是指一个定义非正常情况或错误的对象,由程序或运行时环境抛出,可以根据需要进行相应的捕获和处理。而错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理。
  • 一个异常确实代表了一个错误,但是异常只是代表了一种意外的情况,即一种在正常条件下不会发生的情况,异常处理提供了一种处理异常的有效方式。 3.处理异常的三个基本方法:
  • 根本不处理异常
  • 当异常发生时处理异常
  • 在程序某个位置集中处理异常 4.try-catch语句
  • 没有异常,将继续执行try语句后的语句块,所有catch子句后的语句。
  • 有异常,则控制立刻转移到相应的catch子句处理异常。 5.finally语句
  • 一条try-catch语句可以有一个可选的finally子句,用于定义一段无论是否有异常发生都将执行的代码。
  • 如果有finally子句,则必须跟在所有的catch子句后面。
  • try语句块可以没有catch子句,但仍然可以使用finally子句。

递归

1.递归思想:递归是一种方法能够调用自己的编程技术,掌握递归编程的关键是能以递归的思想考虑问题; 2.无穷递归的情况类似于无限循环; 3.直接递归和间接递归:

  • 方法调用自己的递归,称为直接递归;
  • 如果一个方法调用其他方法,最终导致再次调用自己,则称为间接递归。 4.递归的经典应用是迷宫旅行和汉诺塔问题;

教材学习中的问题和解决过程

  • 问题1:当学习了异常的概念和解决办法以后,我想异常和错误有什么差别,为什么错误不能用解决异常的方法在处理。
  • 问题1解决方案:在教材的思考题中学到了错误和异常的区别: 异常:是一个定义非正式情况或错误的对象,由程序或者运行时环境抛出,可以根据需要捕获和处理。 错误:错误类似于异常,但是错误代表不可恢复的问题并且必须捕获处理。 然而到了这里,我依旧不知道为什么不能用相同的办法处理,于是查找了相关资料,意识到他们相似但是不完全一样,主要差异在运行时出现错误的等级,相比较来说“错误”等级更高。

代码调试中的问题和解决过程

  • 问题1:在完成课堂实践时出现了一个代码运行结果始终为1的情况,而且错误点还无限

  • 问题1解决方案:问了王老师,他说这就是无穷递归的情况,问题出在if-else语句上面,做了如下改进,运行便成功了,着加深了我对无穷递归的理解。

代码托管

脚本截图

上周考试错题总结

分析:这个题出错主要是由于对于概念的理解不够清楚。重载只是为具有不同参数列表的方法提供了替代方法。重写提供了多态性,因为根据当前正在引用的对象调用适当的方法。嵌入是类中的类的封闭。抽象与多态性无关。封装是通过使用可见性修饰符(公共的、私有的、受保护的)实现的。 Upcasting是完全安全的,它是Java支持的单一继承结构的产物。相比之下,Downcasting必须由程序员明确地完成。Java只在一个方向上进行强制转换。upcasting和downcasting的规则并不依赖于使用中的可见性修饰符。 虽然继承和接口支持多态性,但只有在具有后期绑定的情况下才会这样做。但是,重载是多态性的一种形式(方法)名称,多个主体,因此只要程序使用重载,多态性就会被使用。

结对及互评

点评模板:

  • 博客中值得学习的或问题:

    • 刘辰同学在博客记录问题上面比以前更加细致了,对于问题的描述和解决过程逗比以前更好,希望继续努力;
    • 在排版上好像出了点问题,教材问题一的图片好像出现了超出界面的情况,希望改正。
  • 代码中值得学习的或问题:

    • 很好
    • 非常好
  • 基于评分标准,我给本博客打分:满分。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172306
      • 结对学习内容
      • 学习第十一和十二章pp项目。
      • 学习异常和递归的具体内容
      • 对于IO操作的共同探讨
      • 继续完善四则运算的的项目

其他(感悟、思考等,可选)

  • 一直觉得老师应该先讲课,我们再进行进一步的研究学习,毕竟老师应该先传播知识嘛,现在的模式就很舒服了,在学习过程中遇到的问题少了很多,有很多东西看到了就知道,不用像以前那样找不到专业解答,还得自己去找一个个不知道对错的答案。
  • 前一个月每晚都要去练习啦啦操,和班里同学相比少了很多学习时间,现在终于结束,必须要加紧步伐,更上老师同学的脚步呢。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 129/129 1/1 20/20
第二周 359/488 1/2 18/38
第三周 521/1009 2/4 22/60
第四周 1057/2066 1/5 30/90
第五周 636/2702 1/6 30/120
第六周 489/3191 1/7 28/158
第七周 831/4022 1/8 41/199
第八周 382/4404 3/11 16/215
第九周 1301/5705 2/13 28/243

参考资料

  • Java学习笔记(第8版)

  • 《Java学习笔记(第8版)》学习指导

关于狄慧 201771010104《面向对象程序设计java》第九周学习总结的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于20165301 2017-2018-2 《Java程序设计》第九周学习总结、2017-2018-2 20179204《网络攻防实践》第九周学习总结、20172313 2018-2019-1 《程序设计与数据结构》第九周学习总结、20172325 2017-2018-2 《Java程序设计》第九周学习总结的相关信息,请在本站寻找。

本文标签: