异常处理
异常类
类Throwable有两个直接子类:Error和Exception。
RuntimeException和IOException等继承Exception
Error类对象(错误),由Java虚拟机生成并抛弃(通常,Java程序不对这类 异常进行处理) ;
Exception类对象是Java程序处理或抛弃的对象。
Exception类中仅类RuntimeException及其子类未运行时异常;
Java编译器要求Java程序必须捕获或声明所有的非运行时异常 ,但对运行时异常可以不做处理。
异常处理关键字
Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally。
try语句 (可能出现异常)
try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。
catch语句 (处理异常)
catch语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。
catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理的例外类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般。
也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。
finally语句 (结束语句)
try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。
throws语句 (声明异常)
throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是Error或 RuntimeException, 或它们的子类,这个规则不起作用,因为这在程序的正常部分中是不期待出现的。如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。
throw语句 (抛出异常)
throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到
常用类
system类
返回以毫秒数为单位的当前时间
long start=system.currentTimeMillis();
终止当前正在运行的Jvm虚拟机
system.exit(0);
垃圾回收
system.gc();
字符串相关类
String StringBuffer StringBuilder
区别
string test1="abc";
StringBuffer test2=new StringBuffer("abc");
StringBuilder test3=new StringBuilder(""abc);
Date类
Date类中很多方法已经过时,被calender代替
正则表达式
用于验证格式
String stu="abc";
Pattern pattern=Pattern.compily("验证规则");
Matcher matcher=pattern.matcher(stu);
system.out.println(matcher.matches());
如果满足规则,matcher.matches()为true;
反射(运行时探究和使用编译时未知的类)
加载器有三种:根加载器 扩展类加载器 系统类加载器
当一个类被加载到JVM中,同一个类就不会在加载。
连接
连接阶段中把二进制合并到JRE
线程同步
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
线程的生命周期
线程被创建并启动以后要经历五种状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。
新建:使用关键字new创建一个线程后,处于新建状态,此时仅由虚拟机为其分配内存并初始化成员变量,程序不会执行线程执行体。
就绪:当线程对象调用start()方法后,该线程处于就绪状态,虚拟机为其创建调用栈和程序计数器,但是此时线程并没有运行,只是表示线程可以运行了。
运行:当处于就绪状态的线程获得了CPU,开始执行run方法,则该线程处于运行状态。
阻塞:当发生线程调用sleep方法、阻塞式IO方法、suspend方法、等待通知(notify),线程将近阻塞状态。阻塞状态在合适的时候会重新进入就绪状态。
死亡:线程会以以下三种方式结束,然后就处于死亡状态,run方法执行完成、线程抛出未捕获的异常、直接跳跃stop方法结束进程。
线程的控制
isAlive():测试线程是否处于活动状态
isDaemo():测试进程是否为守护进程
join():等待该进程终止
sleep():在指定的毫秒数内让正在执行的线程休眠,该线程不丢失任何监视器的所属权
yield():暂停当前正在执行的线程对象,并执行其他线程,它是将线程转入就绪状态
setPriority(int newPriority):更改线程的优先级
线程的通信
Java为了避免轮询检测,通过wait()、notify()和notifyAll()方法实现进程内通信的机制。 wait():告诉调用线程放弃监控器进入等待模式直到其他线程进入同一监控器并调用notify()方法。
notify():唤醒在此同步器上等待的单个线程
notifyAll():唤醒在此同步器上等待的所有线程
JAVA集合框架
Set、List和Map可以看做集合的三大类。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
Collection接口:
Set接口:
HashSet具体类(无顺序,无重复数据,可以为null)
LinkedHashSet具体类
TreeSet具体类
List接口: ArrayList具体类
LinkedList具体类
向量类Vector具体类
Stack具体类
Map接口: HashMap类
LinkedHashMap类
TreeMap类
ArrayList:以数组的方法实现,查询效率高,增删改效率低;
LinkedList:以链表的方式实现,增删改效率高;
泛型
优点:1.保证数据的安全
2.数据类型不需要转换
Map接口(键值对,key--value一一对应,key不能重复,value可以重复)
JAVA图像界面编程
在java中有ATW和Swing两套组件用于支持图形用户界面编程。
ATW是最早出现的,但是过于依赖操作系统,有很大弊端,AWT 是依靠本地方法来实现其功能的,所以通常把AWT组件称为重量级组件。
Swing是在ATW之上开发的。完全有java代码编写,不依赖操作系统,可以自己调节外观,使得程序员编写程序更方便。
Swing的GUI(图形用户界面)是由容器和组件组成,容器是放置组件的。
布局管理器
FlowLayout: 组件在一行中从左至右水平排列。
BorderLayout:北、南、东、西、中。
GridLayout:以行和列的网格形式安排组件
BoxLayout:更复杂、功能更强的网格布局
事件驱动编程
事件:描述发生了什么的对象。
存在各种不同类型的事件类用来描述各种类型的用户交互。
事件源:事件的产生器。
事件处理器:接收事件、解释事件并处理用户交互的方法
JAVA I/O 系统
IO流的分类
- 根据处理数据类型的不同分为:字符流和字节流
- 根据数据流向不同分为:输入流和输出流
- 根据数据功能不同分为:节点流和处理流
只要是处理纯文本数据,就优先考虑使用字符流;除此之外都使用字节流。
字节流:以字节为单位操作流
- InputStream
- OutputStream
字符流:以字符为单位操作流
- Reader
- Writer
输入流:从程序角度来看,输入到程序中的流
- InputStream
- Reader
输出流:从程序角度来看,从程序中输出的流
- OutputStream
- Writer
节点流:直接与数据源相连,操作流
处理流:直接使用节点流,读写不方便,为了更快的读写文件,有了处理流。处理流不直接连接数据源,而是连接在已存在的流(节点流或处理流)上,通过对数据的处理为程序提供更强大的处理能力
对象流:以对象为单位传输数据。使用类ObjectInputStream和ObjectOutputStream实现,以FileOutputStream和FileInputStream类进行流的中转保存。
对象的序列化:把堆中的对象转化为二进制数据的形式输出。
对象的反序列化:把二进制数据还原成堆中的对象。
序列化标示关键字:Serializable
不能被序列化的关键字:transient
序列化:就是只把一个对象串行化成一个字节流,用于网络传输或者持久化。
归纳总结
- 流的使用步骤:
- 打开一个输入/输出流对象
- 读取或写入数据
- 释放资源,关闭输入/输出流对象
- InputStream和OutputStream主要用来处理可以被直接读作byte的数字
- Reader和Writer主要用来处理文本
java网络编程
网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可。
在InetAddress类中覆盖了Object类的toString方法,分析源码我们可以知道InetAddress中的toString方法返回了用“/“隔开的主机名和IP地址。因此,在上面的代码中直接通过localAddress对象来输出本机计算机名和IP地址(将对象参数传入println方法后,println方法会调用对象参数的toString方法来输出结果)。
当本机绑定了多个IP时,getLocalHost只返回第一个IP。如果想返回本机全部的IP,可以使用getAllByName方法。
getByName()方法
这个方法是InetAddress类最常用的方法。它可以通过指定域名从DNS中得到相应的IP地址。getByName一个String类型参数,可以通过这个参数指定远程主机的域名
TCP编程
在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以java.net.Socket类代表客户端连接,以java.net.ServerSocket类代表服务器端连接。
通过Socket类连接服务器程序最常用的方法就是通过Socket类的构造函数将IP或域名以及端口号作为参数传入Socket类中。Socket类的构造函数有很多重载形式,最常用的一种形式:public Socket(String host, int port)。从这个构造函数的定义来看,只需要将IP或域名以及端口号直接传入构造函数即可。
发送和接收数据
在Socket类中最重要的两个方法就是getInputStream和getOutputStream。这两个方法分别用来得到用于读取和写入数据的InputStream和OutputStream对象。在这里的InputStream读取的是服务器程序向客户端发送过来的数据,而OutputStream是客户端要向服务端程序发送的数据。
关闭网络连接
可以引起网络连接关闭的情况有以下4种:
- 直接调用Socket类的close方法。
- 只要Socket类的InputStream和OutputStream有一个关闭,网络连接自动关闭(必须通过调用InputStream和OutputStream的close方法关闭流,才能使网络连接自动关闭)。
- 在程序退出时网络连接自动关闭。
- 将Socket对象设为null或未关闭最使用new Socket(…)建立新对象后,由JVM的垃圾回收器回收为Socket对象分配的内存空间后自动关闭网络连接。
虽然这4种方法都可以达到同样的目的,但一个健壮的网络程序最好使用第1种或第2种方法关闭网络连接。这是因为第3种和第4种方法一般并不会马上关闭网络连接
创建ServerSocket对象
ServerSocket类的构造方法有四种重载形式,它们的定义如下:
- public ServerSocket() throws IOException
- public ServerSocket(int port) throws IOException
- public ServerSocket(int port, int backlog) throws IOException
- public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
各参数:port是ServerSocket对象要绑定的端口,backlog是请求队列的长度,bindAddr是ServerSocket对象要绑定的IP地址。
如果port参数所指定的端口已经被绑定,构造方法就会抛出IOException异常。但实际上抛出的异常是BindException。
UDP编程
UDP(用户数据报协议)是用于将二进制数据从一台计算机发送到另一台计算机的非连接协议。在Java中数据报包的发送者与接收者都使用java.net.DatagramSocket类发送和接收包。
DatagramSocket的构造方法如下:
- public DatagramSocket() throws SocketException
- public DatagramSocket(SocketAddress bindaddr) throws SocketException
- public DatagramSocket(int port) throws SocketException
- public DatagramSocket(int port, InetAddress laddr) throws SocketException
构造方法中各参数的意思:port是绑定到本地主机指定的端口,bindaddr是封装了服务器和端口号的本地套接字地址,laddr是要绑定的本地地址。
常用方法:
- public void send(DatagramPacket p) throws IOException
- public void receive(DatagramPacket p) throws IOException
这两个方法都带有一个DatagramPacket参数。DatagramPacket代表一个数据报包,与DatagramSocket类似,包的发送者与接收者都要使用到它。DatagramPacket有六个构造方法,其中两个由接收者使用,四个由发送者使用。
接收数据报包:
- public DatagramPacket(byte[] buf, int length):用来接收长度为 length 的数据包,buf为保存传入数据报的缓冲区。
- public DatagramPacket(byte[] buf, int offset, int length):用来接收长度为 length 的包,在缓冲区buf中指定了偏移量offset。
发送数据报包:
- public DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- public DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
- public DatagramPacket(byte[] buf, int length, SocketAddress address) throws SocketException
- public DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) throws SocketException
这几个方法都是将长度为 length 的包发送到指定主机上的指定端口号。
接收数据报包
接收数据报包的执行步骤如下:
- 创建一个足够大的字节数组,用于存储要接收的数据报包的数据。
- 使用该字节数组实例化一个DatagramPacket对象。
- DatagramSocket被实例化,它被指定到套接字要绑定的本地主机上的一个端口。
- 调用DatagramSocket类的receive()方法,将DatagramPacket对象传递到方法中,这将导致执行线程阻塞,直到接收一个数据报包或超时。
在reveive()方法返回后,新包刚传送成功,如果发生了超时,receive()方法不会返回,而是抛出异常。DatagramPacket类的getData()方法可以用于接收包含该数据报包数据的字节数组。
发送数据报包
发送数据报包的执行步骤如下:
- 创建一个足够大的字节数组,用于存储要发送的数据报包的数据。
- 创建DatagramPacket对象,用于存储该字节数组,以及服务器的名称和接收者的端口号。
- DatagramSocket被实例化,它被指定到套接字要绑定的本地主机上的一个端口。
- 调用DatagramSocket类的send()方法,传递DatagramPacket对象参数,发送数据报包。
java数据库编程
JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够非常方便地编写数据库应用程序。
DAO(Data Access Object)即数据存取对象,它位于业务逻辑与持久化数据之间,主要功能是实现对持久化数据的访问。
DAO隔离了业务逻辑代码与数据访问代码,使我们能够很方便地实现不同数据库的持久化操作。
实际上DAO起到的是类似转换器的功能,即将实体转换为数据库中的记录或将数据库中的记录转换为实体。
通常DAO的组成部分包括以下四个内容:
- 数据库操作辅助类:实现数据库操作辅助功能,如获取连接,关闭连接等
- 实体类:用于数据传递
- DAO接口:约定DAO功能
- DAO接口的实现类:具体实现DAO功能
连接数据库
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://local host:3306/数据库名称";
String user="数据库用户名";
String pwd="数据库用户密码";
Connection con=DriverManager.getConnection(url,root,pwd);
Statement ment=con.creatStatement();
java xml解析技术
XML指可扩展标记语言(eXtensible Markup Language),它是一种很像HTML的标记语言。XML的设计宗旨是传输数据,焦点是数据的内容,而HTML被设计用来显示数据,其焦点是数据的外观。XML是不会做任何事情的,它只是被设计用来结构化、存储以及传输信息。
XML标签没有被预定义,我们需要自行定义标签,因此XML被设计为具有自我描述性,它是W3C的推荐标准。
XML用途
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。XML数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同应用程序可以共享的数据变得更加容易。
对开发人员来说,其中一项最费时的挑战一直是在互联网上的不兼容系统之间交换数据,由于可以通过各种不兼容的应用程序来读取XML中的数据,所以以XML交换数据降低了这种复杂性。
XML结构
XML是一种树结构。树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。
XML声明:
<?xml version="1.0" encoding="utf-8"?>
它定义XML的版本(1.0)和所使用的编码(utf-8)字符集。
所有的XML元素都是成对出现的,有一个开始标签,就必须有一个关闭标签。
XML标签对大小写敏感,标签<Letter>与标签<letter>是不同的。
XML文档必须有根元素,标签如果需要嵌套,必须正确嵌套,在内层打开的标签就必须在内层关闭。
XML标签如果需要添加属性,属性值必须加引号。
在XML中编写注释的语法与HTML的语法很相似,都是 <!– This is a comment –>。
在XML中,空格会被保留,不像HTML中,加再多的空格最终都只合并为一个。
XML元素命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
- 可使用任何名称,没有保留的字词。
DTD
DTD(文档类型定义)的作用是定义XML文档的合法构建模块。拥有正确语法的XML被称为“形式良好”的XML,我们可以通过DTD验证XML是“合法”的 XML
注意:
CDATA部分不能包含字符串“]]>”,也不允许嵌套的CDATA部分。
标记CDATA部分结尾的“]]>”不能包含空格或换行
外部文档声明
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE root-element SYSTEM 外部文件>