高级java培训课件.ppt

上传人:rrsccc 文档编号:10796372 上传时间:2021-06-04 格式:PPT 页数:72 大小:338KB
返回 下载 相关 举报
高级java培训课件.ppt_第1页
第1页 / 共72页
高级java培训课件.ppt_第2页
第2页 / 共72页
高级java培训课件.ppt_第3页
第3页 / 共72页
高级java培训课件.ppt_第4页
第4页 / 共72页
高级java培训课件.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《高级java培训课件.ppt》由会员分享,可在线阅读,更多相关《高级java培训课件.ppt(72页珍藏版)》请在三一文库上搜索。

1、高级java程序设计,1 、异常处理 2 、反射 3 、泛型 4 、 多线程 5 、 注释与反射 6 、 网络编程,1.异常处理,本章主要了解java异常的类型、发生和控制。熟悉在java程序中如何灵活运行异常处理,使程序更加人性化。 课程内容: 1.1异常介绍 1.2 异常类型 1.3异常管理 1.4异常控制 1.5异常处理案例,1.1 异常介绍,程序为什么需要异常处理? 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/

2、0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。 有些异常需要做处理,有些则不需要捕获处理。 异常有两个来源。一个是Java运行时环境自动抛出系统生成的异常,比如在代码中执行3/0,这样就会抛出异常。二是程序员自己抛出的异常。,1.2 异常类型,异常结构图 RuntimeException 、Error以及它们的子 类都称为免检异常, 其他异常都为比检异 常,意思编译器会强 制要求程序员检查并 处理它们。,1.3 异常管理,遇到异常应该怎么办?什么时候我们自己会抛出异常? 异常是针对方法来说的,抛出、声明抛出、捕获和处理异常都是在方法中

3、进行的。 Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理 try 程序代码 catch(异常类型 异常的变量名) 程序代码 finally 程序代码 ,1.4 异常控制,抛出异常 检测一个错误的程序可以创建一个正确的异常类型的实例并抛出它。 示例: throw new IllegalArgumentException(wrong Argument);,1.4 异常控制,捕获异常 当有一个异常被抛出,如何捕获?可以使用try-catch捕获并处理。 示例: try 这里为抛出异常的语句; catch(Exception1 e1) 这里处理异常;

4、 catch(Exception2 e2) 这里处理异常; catch(Exception3 e3) 这里处理异常; 注意:当一个语句抛出异常,会强制立刻执行捕获异常的语句。并往下执行,不会执行抛出异常的语句下面的语句。,1.4 异常控制,声明异常 在java中,当前执行的语句必定属于某一个方法。java调用main()方法开始一个程序。每个方法都必须声明它可能抛出的比检异常类型。 给方法声明异常 public void myMethod() throws IOException 声明多个异常 public void myMethod() throws Exception1,Exception

5、2,Exception3,.,ExceptionN,1.4 异常控制,获取异常的信息 异常的信息全部都保存在异常的那个实例中,所有可以通过调用异常实例的方法来获取信息。 获取信息的方法: printStackTrace()、getMessage()、toString()和getStackTrace(),1.5 异常处理案例,如下面这串代码:,2.反射,本章主要介绍java反射对类操作,了解java反射对类型的属性的获取和方法获取及其调用。 课程内容: 2.1 反射介绍 2.2反射(属性) 2.3 反射(方法),2.1反射介绍,java反射是用来获取一个类信息的技术。 反射可以获取类的属性、构造

6、方法、方法,并包括获取其值或者调用其方法。 其使用的class为java自带包java.lang.reflect中; Class cls = Class.forName(className);,2.2反射(属性),反射获取属性使用到的class为Filed ();获取属性对象名 ();获取属性类型,2.3反射(方法),反射获取方法使用到的class为Method Modifier.toString(Method.getModifiers();获取方法修饰符 Method.invoke(实例,参数(Objett)获取属性类型 Method.getReturnType() /获取方法的返回值. C

7、onstructor ctorlist = cls.getDeclaredConstructors(); 获取构造方法,其他类似反射(方法)的使用,3.泛型,了解泛型的优点,并掌握java原生部分泛型的使用及建立自己的泛型类。 课程内容: 3.1 泛型优点 3.2泛型类的使用 3.3 建立泛型类,3.1 泛型优点,在以前的java中是没有泛型的,那为什么会引入泛型呢? 泛型的好处: 1、类型安全。 Map m = new HashMap(); m.put(key, blarg); String s = (String) m.get(key); 2、消除强制类型转换。 泛型的一个附带好处是,消除

8、源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。 3、泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。,3.2 泛型的使用,java预置的泛型使用 Map以键值对储存类型的对象 Map map =new Map(); List以数组储存类型的对象 List list =new ArrayList(); List list =new ArrayList();,3.3 建立泛型类,建立泛型类 Generics generics =new Generics(); boolean flag = generics.getT();/当你这样使

9、用的时候就会报错。,4 线程及线程应用,本章是了解线程的概念,掌握线程的控制,可以灵活运用线程 课程内容: 4.1线程的概念 4.2线程的使用 4.3线程同步和通信,4.1线程,4.1.1 线程的概念 4.1.2 线程的生命周期,4.1.1 线程的概念,进程:在多任务系统中,每个独立执行的程序称为进程 线程:一个进程中可以包含一个或多个线程,一个线程就是一个程序内部的一条执行线索 当程序启动时,就自动产生一个线程,主函数main就是在这个线程上运行的。 创建多线程有两种方法:继承Thread类和实现Runnable接口,4.1.2 线程的生命周期,新建 就绪 运行 阻塞 死亡,4.2线程的使用

10、,4.2.1 创建线程的方法 4.2.2 使用runnable接口的好处 4.2.3 启动线程 4.2.4 前台线程和后台线程 4.2.5 联合进程与join方法,4.2.1 创建线程的方法,用Thread类创建线程 要实现多线程,必须编写一个继承了Thread类的子类,子类要重写Thread的run方法,在run方法中调用想在线程上运行的程序代码,4.2.1 创建线程的方法,使用Runnable接口创建多线程 定义一个实现Runnable接口的类并生成实例 生成一个Thread的实例 将生成的Runnable接口的实例作为参数传递 给Thread的构造方法,4.2.2使用runnable接口

11、的好处,可以实现多个线程处理同一资源的情况 避免Java单继承性带来的局限 代码可以被多个线程共享(即run中的代码),4.2.3 启动线程,线程启动:start()方法 线程启动后,将执行线程实例中的run方法。,4.2.4 前台线程和后台线程,对于Java程序,只要有一个前台线程在运行,进程就不会结束;如果一个进程中只有后台线程运行,这个进程就会结束 前台线程和后台线程是相对而言的,按前面的方式产生的都是前台进程,如果在调用start方法前设置IsBackground = true;,这个线程就变成了后台线程,4.2.4 前台和后台线程的区别,public static void mySt

12、aticThreadMethod() Thread.Sleep(3000); Thread thread = new Thread(myStaticThreadMethod); / thread.IsBackground = true; thread.Start(); 如果运行上面的代码,程序会等待3秒后退出,如果将注释去掉,将thread设成后台线程,则程序会立即退出 要注意的是,必须在调用Start方法之前设置线程的类型,否则一但线程运行,将无法改变其类型 通过BeginXXX方法运行的线程都是后台线程,4.2.5 联合进程与join方法,void join(long millis) vo

13、id join(long millis,int nanos) 这两个方法的作用是指定合并的时间(前者精确到毫秒,后者精确到纳秒),即两个线程合并指定的时间后,又开始分离,回到以前的状态 转化理解:join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。,4.3线程同步和通信,5.3.1 线程同步

14、5.3.2 线程通信 5.3.3 线程死锁 5.3.4 线程的生命控制,4.3.1 线程同步,破坏线程安全的案例 同步代码块的格式: synchronized(object)代码块 object可以是任意一个对象,4.3.1 线程同步,同步通过改变object的锁旗标实现 同步会降低程序的性能 同步代码块不仅指同一个代码块在多个线程间实现同步,也可以是不同的代码块之间相互同步,只要各synchronized(object)“代码“语句中的object是同一个对象,4.3.1 线程同步,同步方法(函数) 除了可以对代码块进行同步外,也可以对方法实现同步,只需在要同步的方法定义前加上synchro

15、nized关键字即可,4.3.1 线程同步,synchronized关键字的使用 1)是某个对象实例内,synchronized aMethod()可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 2)是某个类的范围,synchronized stati

16、c aStaticMethod防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 synchronized关键字是不能继承的,也就是说,父类的方法synchronized f() 在继承类中并不自动是synchronized f(),而是变成了f()。继承类需要你显式的指定它的某个方法为synchronized方法;,4.3.2 线程通信,线程间的交替调用: wait:使当前线程放弃监视器进入睡眠状态,直到其他线程进入同一监视器并调用notify notify:唤醒同一监视器对象中调用wait的第一个线程 notifyAll:唤醒同一监

17、视器对象中调用wait的所有线程,具有最高级的线程首先被唤醒并执行,4.3.3 线程死锁,Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。 在这种就需要在程序设计时考虑到这种情况,当出现这种情况,只有先牺牲其中一个先让他所持有的刀或叉。,4.3.4 线程的生命控制,不推荐使用的终止线程生命的方法: (1)suspend和resume:会导致死锁 (2)stop:导致数据不完整 正确终止线程生命:interrupt();

18、,4.3.5正确终止线程生命interrupt,public void run() try /检查程序是否发生中断 while (!Thread.interrupted() System.out.println(I am running!);/point1 before sleep Thread.sleep(20);/point2 after sleep System.out.println(Calculating); for(int i = 0; i 900000; i+) d = d + (Math.PI + Math.E) / d; catch (InterruptedException

19、 e) System.out.println(Exiting by Exception); System.out.println(ATask.run() interrupted!);,5.注释与反射,本章主要介绍,5.注释与反射,在java的学习中我们会经常看到override,我们也就都知道它是一个注释,但是一般注释都仅仅只是一段说明的语句并不是功能性的代码,理论上是没有功能的。但是override的确是有功能的。 这是因为在java有一部分的注释是能够实现功能的。 我们可以自己定义注释类,比如: public interface myA String value() default val

20、ue1; String id() default id1; 我们把注释在方法的前面,放在属性的前面,放在类名的前面,并通过反射中的getAnnotation()函数获取注释。这个函数在Class、Method、Constructor、Field中都有提供。注释如下:myA(value=aaaa,id=1111),5.注释与反射(续),通过一段代码获取注释的对象,如下 myA mA = field.getAnnotation(myA.class); 我们就可以通过注释提供的方法获取定义注释时的值。同时也就可以根据属性值经行一些必要的操作。,6 网络编程,本章是介绍通过类连接到www,然后讨论如何

21、通过TCP/IP或UDP协议在网络上的两个程序间建立连接并交换数据 课程内容: 6.1网络概述 6.2InetAddress 类 6.3UDP网络程序 6.4TCP网络程序,6.1网络概述,6.1.1 Ip地址 6.1.2 端口号 6.1.3 TCP和UDP 6.1.4 TCP、UDP数据包基本格式 6.1.5 Socket 6.1.6 J包,6.1.1 Ip地址,IP地址用4个字节,32位二进制数来表示,称为Ipv4 正在试验和定制Ipv6,即16个字节表示,6.1.2 端口号,一台计算机上可同时运行多个网络程序,IP地址只能保证把数据送到计算机,无法得知把数据交给哪个网络程序,所以每个被发

22、送的数据包的头部都包含一个称为“端口”的部分,表示数据应交给哪个应用程序 端口是0-65535间的一个整数,每个网络程序都有一个端口,0-1023端口是一些知名网络程序使用的,用户的普通网络程序应使用1024以上的端口数 端口不能被两个或以上的网络程序重用,6.1.3 TCP和UDP,TCP:Transmission Control Protocol,传输控制协议 UDP:User Datagram Protocol,用户数据报协议,6.1.3 TCP和UDP TCP,TCP TCP是面向连接的通信协议,提供两台计算机之间的可靠无差错的数据传输 应用程序使用TCP通信时,源和目标之间会建立一个

23、虚拟连接,6.1.3 TCP和UDP,UDP UDP是无连接通信协议,不保证数据的可靠传输,但能够向若干目标发送数据,接受发自若干个源的数据,6.1.4 TCP、UDP数据包基本格式,6.1.5 Socket,Socket是网络驱动层提供给应用程序的接口和一种机制,通过一种绑定机制与驱动程序建立关系,包含IP和Port信息 发送数据时,应用程序将数据交给Socket,由Socket交给驱动程序向网络上发送 接收数据时,计算机从网络上收到与该Socket绑定的IPProt相关的数据后,由驱动程序交给Socket,应用程序可从Socket中提取数据,6.1.6 J包,Java分别为UDP和TCP提

24、供了相应的编程类,这些类放在包中,与UDP对应的是DatagramSocket,与TCP对应的是ServerSocket(用于服务器端)和Socket(用于客户端),InetAddress,InetAddress是用于表示计算机地址的一个类 InetAddress的getByName(String host)方法可根据条件返回一个InetAddress的实例 InetAddress的getHostAddress()可返回 IP 地址字符串,6.3UDP网络程序,6.3.1 数据报通信的概述 6.3.2 DatagramSocket的构造方法 6.3.3 关闭Socket 6.3.4 Datag

25、ramPacket的构造方法 6.3.5 数据的发送和接收 6.3.6 数据报通信的注意点,6.3.1 数据报通信的概述,DatagramSocket 和DatagramPacket DatagramSocket 好比一个港口,应用程序只要把装着数据的“集装箱”放到港口上就算完成了数据的发送,剩下的工作由驱动程序完成 DatagramPacket 就是存放数据的集装箱,6.3.2 DatagramSocket的构造方法,DatagramSocket的构造方法: public DatagramSocket() throws SocketException 使用该构造方法创建DatagramSoc

26、ket对象时未指定端口号,系统会自动分配一个还没有被使用的端口号,用于编写发送程序,6.3.2 DatagramSocket的构造方法,Public DatagramSocket(int port) throws SocketException 使用该构造方法创建DatagramSocket对象时指定一个端口号,用于编写接受程序 Public DatagramSocket(int port,InetAddress laddr) throws SocketException 使用该构造方法创建DatagramSocket对象时除了指定一个端口号外,还指定了IP地址,适用于由多块网卡的情况,用于编

27、写接受程序,6.3.3 关闭Socket,但不再使用某个Socket时,应该调用DatagramSocket.close()方法关闭这个Socket,释放端口号和其他资源,6.3.4 DatagramPacket的构造方法,public DatagramPacket(byte buf,int length) 使用该构造方法创建DatagramPacket对象时指定了数据包的内存空间和大小,接收数据时用 public DatagramPacket(byte buf,int length,InetAddress address,int port) 使用该构造方法创建DatagramPacket对象

28、时指定了数据包的内存空间和大小,以及数据包的目标地址和端口,发送数据时用,6.3.5 数据的发送和接收,发送数据: public void send(DatagramPacket p) throws IOException 接收数据 public void receive(DatagramPacket p) throws IOException,6.3.5 数据的发送和接收,DatagramPacket的getInetAddress()方法返回一个InetAddress实例对象 DatagramPacket的getPort()返回端口号,6.3.6 注意,UDP数据发送时不可靠的,数据可能在传

29、输过程中丢失 必须先运行UDP接收程序,再运行发送程序 UDP接收程序运行到receive方法时将阻塞,直到网络上有数据到来,如果网络上没有数据发送过来,receive方法也没有阻塞,那么通常情况是使用了一个被其他程序占用的端口号,6.4 TCP网络程序,6.4.1 TCP概述 6.4.2 ServerSocket的构造方法 6.4.3 Socket的构造方法 6.4.5 TCP服务器和客户端的连接 6.4.6 完善TCP程序,6.4.1 TCP概述,使用UDP通信的两个程序没有主次之分 使用TCP进行通信的两个程序有主次之分,一个是服务器程序,一个是客户端程序,6.4.1 TCP概述,服务器

30、端与客户端的交互过程 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接 客户端程序创建一个Socket,并请求与服务器建立连接 服务器接受客户的连接请求,并创建一个薪的Socket与该客户建立专线连接 刚才建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话 服务器开始等待新的连接请求,6.4.2 ServerSocket的构造方法,public ServerSocket() throws IOException 未与任何端口号绑定,不能被直接使用,需要继续调用bind方法才能完成和其他构造方法一样的功能 public ServerSocke

31、t(int port) throws IOException 创建对象时就将ServerSocket和端口号绑定,如果port为0,则系统会自动分配一个未被使用的端口号,但由于作为服务器程序,端口号必须事先指定,其他的客户端程序才能与之连接,所以prot指定为0的情况一般不被使用,6.4.2 ServerSocket的构造方法,public ServerSocket(int port,int backlog) throws IOException 在第二个构造方法的基础上,根据backlog参数指定,在服务器忙时,可以与之保持连接请求的等待客户数据量 public ServerSocket(i

32、nt port,int backlog,InetAddress bindAddr) throws IOException 在第三个构造方法的基础上,根据bindAddr指定IP地址,适用于多个网卡的情况,6.4.2 ServerSocket的构造方法,public Socket() 创建的Socket对象不与任何服务器建立连接,不能被直接使用,需调用connect方法才能完成和其他构造方法一样的功能,6.4.3 Socket的构造方法,public Socket(String host,int port) throws UnknownHostException,IOException publ

33、ic Socket(InetAddress address,int port) throws IOException 这两个构造方法创建Socket对象后,会根据参数连接在特定地址和端口上运行的服务器程序,其中host为主机名,address为IP地址,6.4.3 Socket的构造方法,public Socket(String host,int port,InetAddress localAddr,int localPort) throws IOException public Socket(InetAddress address,int port,InetAddress localAddr

34、,int localPort) throws IOException 这两个构造方法在前两个构造方法的基础上还指定了本地Socket所绑定的IP地址和端口号,由于客户端的IP地址和端口号选择并不重要,所以一般情况下不使用这两个构造方法,6.4.4 TCP服务器和客户端的连接,服务器端调用ServerSocket.accept方法等待客户的连接请求,一旦accept接收了客户的连接请求,该方法将返回一个与该客户建立了专线连接的Socket对象 当客户端和服务器端的两个Socket建立了专线连接后,连接的一段能向另一端连续写入字节,也能从另一端连续读入字节,即建立了专线连接的两个Socket是以I

35、O流的方式进行数据交换的,java提供了Socket.getInputStream方法返回Socket的输入流对象,Socket.OutputStream方法返回Socket的输出流对象。 只要连接的一端向该输出流对象写入了数据,连接的另一段就能从其输入流对象中读取这些数据,6.4.5 完善的TCP服务器程序,能接收多个客户的连接请求,为每个客户连接创建一个单独的线程与客户进行对话 思路: 1.一次accept方法只接收一个连接,所以accept方法需放置一个循环中,这样才能接收多个连接 2.每个连接的数据交换代码也放在一个循环中,保证两者能够不停地交换数据 3.每个连接的数据交换代码,必须放在独立的线程中运行,否则在这段代码运行期间无法执行其他的程序代码,accept方法也就得不到调用,新的连接无法进入,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1