JavaSE复习之异常&网络编程&JDBC知识总结

目录

Java异常(Exception)概述

注意:代码或语法错误不是异常,语法错误的时候不会生成

异常抛出机制

java异常体系结构

常见的异常

异常处理

throws

程序运行

运行期异常和编译期异常

编译期异常(检查期异常)

RunTimeException(运行期异常)

throws和throw的区别

throws

throw

自定义异常

基本语法

网络编程概述

要进行网络数据传输的核心问题

网络模型

网络通信要素:IP 端口 协议

IP(Internet Protocol Address)互联网协议地址

端口

通信协议(规则,规范,约定)

传输层的两个重要协议

传输控制协议TCP(Transmission Control Protocol)

传输前采用“三次握手”方式

断开连接前要采用“四次挥手”方式

为什么要四次挥手?

用户数据报协议UDP(User Datagram Protocol)

TCP编程

客户端Socket的工作过程包含以下四个基本的步骤:

服务器程序的工作过程包含以下四个基本的步骤:

UDP编程

流 程:

Java database connectivity(java数据库链接)

jdbc链接数据库步骤:

1.在项目中添加java文件

2.加载驱动类

3.建立与数据库的链接,获得链接对象

4.发送SQL

预编译PreparedStatement

statement和preparestatement的区别


Java异常(Exception)概述

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数 据的格式,读取文件是否存在,网络是否始终保持通畅等等。

出现异常后会导致JVM(Java虚拟机)停止运行,后续程序无法执行

int a = 10;
int b = 0;
System.out.println(a/b);
//运行时会报错,除数不能为0

注意:代码或语法错误不是异常,语法错误的时候不会生成

异常抛出机制

Java中默认的异常处理机制:将出现的异常,按不同的类型分类为每一种异常封装了一个类来表示,当出现某种类型的异常情况时,会抛出此类的对象,然后终止虚拟机的运行

如果没有捕获到这个异常对象将导致程序终止

使用异常管理机制,对程序运行过程中出现的异常情况进行捕捉并处理

java异常体系结构

Throwable可分为两类,Error和Exception

Error:错误,是java虚拟机无法解决的严重问题,如JVM系统内部错误,资源耗尽等严重情况,一般不编写针对性的代码进行处理

例如:StackOverflowError(栈内存溢出),OutOfMemoryError(堆内存溢出)

Exception:其他因编程原因错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。

常见的异常

ArithmeticException算术异常(比如除数为0)

ArrayIndexOutOfBoundsException数组索引越界

StringIndexOutOfBoundsExcepiton字符串索引越界

ClassCastException类转换异常,Integer不能转换成String

NumberFormatException数字格式化异常

NullPointerException调用null对象实例方法/属性异常(一般称为空指针异常)

异常处理

throws

定义一个方法的时候可以使用throws关键字声明,表示此方法 不处理异常,而交给方法调用处进行处理

●任何方法都可以使用throws关键字声明异常类型,包括抽象方法。 ● 调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么 继续使用throws声明。 ● 如果抛出的是运行期异常,则不会有任何提示,需要查看所调用的方法结构

在编码时,就可能出现问题的代码(经验问题)预先编写一些处理机制

程序运行

出现异常执行处理机制,继续运行后续的程序

try{

编写可能出现异常的代码

}catch(异常类型){

处理机制

}catch(Exception e){

//可在最后catch Exception用于捕获所有类型的异常

}finally{

finally代码块中的内容一定会执行

一:当catch没有捕获成功时后面的代码无法执行,但是finally可以执行

二:确保在出现异常的情况下依然最终把流对象关闭

if(in!=null){  in.close();}

三:无论是try中还是catch中进行return操作,都必须在retrun之前先执行finally代码块

}

运行期异常和编译期异常

两者区别在于有没有继承RunTimeEcxeption

编译期异常(检查期异常)

在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)XX异常,并明确督促程序员提前编写处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,例如:FileNotFoundException(文件找不到异常)

编码不支持,文件找不到等........都属于检查期异常

RunTimeException(运行期异常)

(即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免.

数组越界,算术异常,类型转换等......都属于运行时异常

throws和throw的区别

throws

用在方法声明部分,表示此方法中可能出现的某种类型的异常,此方法不处理异常,谁调用谁处理

throw

在方法体中,抛出一个具体的异常对象,该方法终止运行,在异常对象中的构造方法中自定义异常原因

自定义异常

自己定义的异常类,用API中的标准异常类的间接或直接到子类

作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆

基本语法

public class 异常类名 extends Exception/RuntimeException{
  public 异常类名(String msg){
    super(msg);
    }
}

自定义异常类中往往不写其他方法,只重载需要使用的构造方法

继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或者throws抛出

什么是计算机网络

把分布在不同地理区域的计算机设备通过通讯设备和物理线路连接(网线,光纤,交换机)起来,由功能完善的软件最终实现资源共享,数据传输。

网络编程概述

在网络的基础上,开发的程序能够进行数据的传输

java语言是支持网络的

java语言将网络链接的细节都封装起来了,对外提供一套网络库(类)

就可以进行同意环境的网络编程

要进行网络数据传输的核心问题

如何找到网络世界中的目标主机和程序(IP和端门)

找到后如何安全高效的进行数据传输(协议)

网络模型

应用层:QQ,微信(发送内容)

传输层:加入协议控制(内容)

网络层:IP 协议控制(内容/转成数字编码)

物理层:网线,光纤

网络通信要素:IP 端口 协议

IP(Internet Protocol Address)互联网协议地址

计算机的地址

ipconfig 局域网ip 一般192.168.开头

本机回环地址 127.0.0.1访问自己的电脑

端口

计算机中运行的每个程序都对应分配一个整数的编号(端口号),不能重复

端口号是计算机中应用程序的一个整数数字标号,用来区分不同的应用程序

065532为有效的端口号,一般01024为被系统使用或保留的端口号

要对一些程序定义端口号的时候要选择1025~65535范围内的整数数字

比如MySQL的端口号是3306,SQLServer的端口号是1433,Oracle端口号是1521

通信协议(规则,规范,约定)

计算机网络中实现通信必须有一些约定,即通信协议,对传输速率,传输代码,代码结构,传输控制步骤,出错控制(出错后应对方法)等指定标准(规则)

传输层的两个重要协议

传输控制协议TCP(Transmission Control Protocol)

客户端向服务器端发送数据前,首先要建立连接(测试网络是否通畅)

正式传输数据

断开时还要相互确认

使用TCP协议前,需先建立TCP连接,形成传输数据通道

TCP协议可靠安全,但效率不如UDP

传输前采用“三次握手”方式

一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认(客户端想服务器发送链接请求)

二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态(当服务器收到客户端连接请求后,给客户端做出回应)

三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成 TCP 三次握手(客户端为服务器的回应做出确认回应,开始传输数据)

断开连接前要采用“四次挥手”方式

一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后客户端进入 FIN-WAIT-1 状态。

二次挥手:服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (ACK=x+1)标志的数据包->客户端,然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态

三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。

四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

为什么要四次挥手?

TCP 是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。

TCP协议进行通信的两个应用进程:客户端,服务端

在连接中可大量

用户数据报协议UDP(User Datagram Protocol)

把要发送的数据封装成一个数据报(数据包)

数据包中包含数据,对方的ip以及对方的端口,只管发送即可,

是否发送成功不清楚,这是一种不可靠的传输方式

TCP编程

利用套接字(Socket)开发网络应用程序早已被广泛采用,以至于成为事实上的标准

通信的两端都要有Socket,是两台机器间通信的端点

网络通信其实就是socket间的通信

socket允许程序把网络连接当成一个流,数据在两个socket间通过io传输

客户端Socket的工作过程包含以下四个基本的步骤:

● 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务 器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。 ● 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流, 使用 getOutputStream()方法获得输出流,进行数据传输 ● 按照一定的协议对 Socket 进行读/写操作:通过输入流读取服务器放入线路的 信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。 ● 关闭 Socket:断开客户端到服务器的连接,释放线路

服务器程序的工作过程包含以下四个基本的步骤:

● 调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端 口上。用于监听客户端的请求。 ● 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信 套接字对象。 ● 调用 该Socket类对象的 getOutputStream() 和 getInputStream ():获取 输出流和输入流,开始网络数据的发送和接收。 ● 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字

UDP编程

● 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。 ● UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP 数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。 ● DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址 和端口号以及接收端的IP地址和端口号。 ● UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方 的连接

流 程:

  1. DatagramSocket与DatagramPacket
  2. 建立发送端,接收端
  3. 建立数据报
  4. 调用Socket的发送、接收方法
  5. 关闭Socket ● 发送端与接收端是两个独立的运行程序

Java database connectivity(java数据库链接)

本章讲的是java程序链接数据库的api(类,接口)

java程序可以链接不同的数据库,但是不同的数据库具体的链接细节不同,

jdbc链接数据库步骤:

1.在项目中添加java文件

2.加载驱动类

Class.forName("com.mysql.cj.jdbc.Driver");          // MySQL 数据库驱动

3.建立与数据库的链接,获得链接对象

// 连接本地 RUNOOB 数据库,需设置时区
static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&serverTimezone=UTC";

static final String USER = "root";            // 数据库账号
static final String PASS = "root";          // 数据库密码

Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);    // 建立连接
conn.close();                                                       // 关闭连接

4.发送SQL

Statement stmt = = conn.createStatement();         // 创建 Statement 对象

// executeQuery 执行查询操作,返回 ResultSet 结果集
ResultSet rs = stmt.executeQuery("SELECT * FROM websites"); 
// executeUpdate 执行更新操作,返回 int 数据表示受影响行数
int len = stmt.executeUpdate("DELETE * FROM websites"); 

stmt.close();                                      // 关闭 Statement 对象

预编译PreparedStatement

PreparedStatement 类继承自 Statement 类,在 JDBC 开发中用来取代前者。有以下两个优势:

可对 SQL 语句进行预编译,可以灵活地修改 SQL 语句,提高开发效率。 把用户输入单引号转义,防止恶意注入,保护数据库安全。

Connection connection = DriverManager.getConnection();
String sql = "INSERT INTO test(id,name) VALUES (?,?)";
PreparedStatement stmt = connection.preparedStatement(sql);   // 创建对象并预编译
stmt.setInt(1, 755);                                          // 在第一个占位符(?)位置插入数字
stmt.setString(2, "MrJoker");                                 // 在第二个占位符(?)位置插入字符串
stmt.executeUpdate();                                         // 更新并执行

statement和preparestatement的区别

相同点:都是向数据库发送sql

statement:将参数直接拼到sql中,要拼接字符串,写起来麻烦,安全性差(可在参数 拼接or 1=1)

preparedStatement:先用?占位,然后通过setobject方法赋值,写起来不用拼接字符串,安全可靠,在赋值时进行检测,可以防止sql注入

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值