Bug調試專項練習二筆記

專項排錯

網絡編程專項排錯

本程序存在兩處代碼錯誤。所有找出後能夠實現文件上傳功能, 上傳成功後打開ServerDir文件夾,找到打開copy.jpg能夠正常顯示。java

錯誤1.文件找不到。 錯誤2.圖片上傳成功,訪問Socket時出錯。編程

需排錯代碼

接收端:數組

package com.itheima.demo1;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
   public static void main(String[] args) throws IOException {
       ServerSocket ss = new ServerSocket(10001);

       Socket accept = ss.accept();

       //網絡中的流,從客戶端讀取數據的
       BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
       //本地的IO流,把數據寫到本地中,實現永久化存儲
       BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("ServerDir\\copy.jpg"));

       int b;
       while((b = bis.read()) !=-1){
           bos.write(b);
      }

       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
       bw.write("上傳成功");
       bw.newLine();
       bw.flush();

       bos.close();
       accept.close();
       ss.close();


  }
}

發送端:服務器

package com.itheima.demo1;

import java.io.*;
import java.net.Socket;

public class ClientDemo {
   public static void main(String[] args) throws IOException {
       Socket socket = new Socket("127.0.0.1",10001);

       //是本地的流,用來讀取本地文件的.
       BufferedInputStream bis = new BufferedInputStream(new FileInputStream("ClientDir\\1.jpg"));

       //寫到服務器 --- 網絡中的流
       OutputStream os = socket.getOutputStream();
       BufferedOutputStream bos = new BufferedOutputStream(os);

       byte[] bytes=new byte[1024];
       int len;
       while((len = bis.read())!=-1){
           bos.write(bytes,0,len);//經過網絡寫到服務器中
      }
       bos.flush();
       //給服務器一個結束標記,告訴服務器文件已經傳輸完畢
       socket.shutdownOutput();


       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
       String line;
       while((line = br.readLine()) !=null){
           System.out.println(line);
      }
       bis.close();
       socket.close();


  }
}

首次運行異常

出現了系統找不到指定路徑網絡

 

 

異常緣由

代碼中寫的是相對於項目下的路徑,而咱們的存放位置在模塊下多線程

 

 

 

 

解決方案

更改路徑,加上項目名socket

 

 

再次運行出現數據寫入異常

 

 

異常緣由

經過debug發現,每次寫入時候數組爲空,寫入爲空ide

數據沒有讀取到數組中,因此每次寫入的爲空測試

 

 

解決方案

將數組傳入atom

 

 

再次運行出現了訪問出錯

 

 

解決方案

 

 

問題解決成功

 

 

反射構造排錯

錯誤代碼

類文件

package com.itheima.demo1;

import java.lang.reflect.Constructor;


public class ReflectDemo1 {
   public static void main(String[] args) throws Exception {

       Class clazz = Class.forName("com.itheima.demo1.Student");
       Constructor constructor = clazz.getDeclaredConstructor(String.class);
       Student wang = (Student) constructor.newInstance("老王");
       System.out.println(wang);

  }
}

javabean類

package com.itheima.demo1;

public class Student {
   private String name;
   private int age;


   public Student() {

  }

   private Student(String name) {
       

  }

   public Student(String name, int age) {

  }

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }
}

排錯說明

本題目有兩處錯誤。目前運行會報錯。 錯誤1.運行直接會報出的異常。 錯誤2.運行結果是Student{name='null', age=0}。要求打印結果是: Student{name='老王', age=0}

首次運行錯誤信息

 

 

 

 

 

 

緣由該構造是私有的,咱們使用此構造須要修改Accessible

修改方案

修改臨時檢測

 

 

再次運行爲null異常

異常信息

 

 

緣由

私有帶參構造沒有進行賦值操做

 

 

解決方案

進行賦值

 

 

最終效果

 

 

反射方法排錯

類文件

package com.itheima.demo2;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class ReflectDemo2 {
   public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {

       Class clazz = Class.forName("com.itheima.demo2.Student");
       Method method = clazz.getMethod("function4", String.class);
       Student student = (Student) clazz.newInstance();
       Object result = method.invoke("hello");
       System.out.println(result);
  }
}

javabean


package com.itheima.demo2;

public class Student {

   private void show() {
       System.out.println("私有的show方法,無參無返回值");
  }

   public void function1() {
       System.out.println("function1方法,無參無返回值");
  }

   public void function2(String name) {
       System.out.println("function2方法,有參無返回值,參數爲" + name);
  }

   public String function3() {

       return "function3";
  }

   public String function4(String name) {

       return name;
  }
}

排錯需求

本題目有1處錯誤。目前運行會報錯:IllegalArgumentException。要求打印結果是: hello

運行錯誤

 

 

錯誤緣由

invoke方法傳參錯誤

 

 

解決方案

修改參數

 

 

最終效果

 

 

dtd限制xml排錯

dtd代碼

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

xml代碼

<?xml version="1.0"?>
       <!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<body>Don't forget the meeting!</body>
<heading>Reminder</heading>
</note>

報錯位置

 

 

錯誤緣由分析

標籤位置和限制文檔位置不符,致使報出此錯誤

 

 

解決方案

修改位置

 

 

xsd限制xml排錯

xml文件

<?xml version="1.0"?>
<note
       xmlns="http://www.itheima.com.cn"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.itheima.com.cn note.xsd">

   <to>George</to>
   <from>John</from>
   <heading>Reminder</heading>
   <body>aaa</body>
</note>

xsd文件

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
          targetNamespace="http://www.itheima.com.cn"
          xmlns="http://www.itheima.com.cn"
          elementFormDefault="qualified">

   <xs:element name="note">
       <xs:complexType>
           <xs:sequence>
               <xs:element name="from" type="xs:string"/>
               <xs:element name="to" type="xs:string"/>
               <xs:element name="heading" type="xs:string"/>
               <xs:element name="body" type="xs:int"/>
           </xs:sequence>
       </xs:complexType>
   </xs:element>

</xs:schema>

錯誤信息:

 

 

 

錯誤緣由

限制文檔順序和類型引起異常

 

 

修改方案

修改位置,修改數據類型

 

 

最終效果

 

 

多線程排錯

錯誤代碼

線程任務類

package com.itheima.demo1;

public class MyThread extends Thread {
   @Override
   public void run() {
       //獲取當前執行線程的名稱
       String name = Thread.currentThread().getName();
       System.out.println(name+"線程進來執行了");
       for(int i=0; i<5; i++) {
           System.out.println(i);
      }
  }
}

測試類:

package com.itheima.demo1;

public class MyThreadDemo {
   public static void main(String[] args) {
       MyThread mt = new MyThread();
       mt.setName("1號線程");
       mt.start();
  }
}

排錯說明

運行MyThreadDemo中的主方法,觀察其運行結果後修改代碼,要求運行結果是:

1號線程線程進來執行了
0
1
2
3
4

運行錯誤

 

 

 

錯誤緣由

run是調用,start纔是開啓線程

修改方案

 

 

最終效果

 

 

多線程重複票問題

錯誤代碼

線程任務類

package com.itheima.demo2;

public class MyRunnable implements Runnable {
   private int count = 10;

   @Override
   public void run() {
       while (true) {
           synchronized (MyRunnable.class) {
               if (count > 0) {
                   System.out.println(Thread.currentThread().getName() + "售出:" + count + "號票");
                   count--;
              }
          }
      }
  }
}

測試類

package com.itheima.demo2;

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

       MyRunnable my1 = new MyRunnable();
       MyRunnable my2 = new MyRunnable();

       Thread t1 = new Thread(my1,"A窗口");
       Thread t2 = new Thread(my2,"B窗口");


       t1.start();
       t2.start();
  }
}

排錯需求

運行MyRunnableDemo中的主方法,觀察其運行結果後修改代碼,要求運行結果是:

A窗口售出:10號票
A窗口售出:9號票
A窗口售出:8號票
A窗口售出:7號票
A窗口售出:6號票
A窗口售出:5號票
A窗口售出:4號票
A窗口售出:3號票
A窗口售出:2號票
A窗口售出:1號票

注意:出現哪一個窗口不重要,重要的是隻能有10張被售出。

錯誤信息

出現重複票

 

 

解決方案

數據未靜態

 

 

修改方案

將數據進行靜態

 

 

程序未結束分析

沒有結束語句

修改方案

加一個判斷票數爲0,結束程序

 

 

 

最終效果

相關文章
相關標籤/搜索