异常
什么是异常(狭义的 Exception 可以处理的)
异常体系
Throwable
Error
Exception
运行时异常
编译期异常
异常处理
try
catch
finally
throws
throw
自定义异常
throws:在方法参数列表后面,是用来声明此方法有可能会出现异常,谁调用谁处理。注意,运行期异常不主动提示,检查异常会主动提示
throw关键字用于显示抛出异常,在方法体内,当不满足某种条件时,主动抛出一个异常对象,程序不再向后执行。
自定义异常:Java API中定义的标准异常类,都是与语法有关的(例如索引越界,空指针),但是我们程序有可能不满足某种业务条件时,想以抛出异常的形式处理,此时就需要自定义一个与业务相关的异常类来表示(例如分数不合法,提供ScoreException)
示例:
package exception;
import java.util.Hashtable;
//异常处理(throw)
public class ThrowText {
public static void main(String[] args) {
try {
char res = checkscore(110);
System.out.println(res);
} catch(Exception e){
e.printStackTrace();
System.out.println(e.getMessage());
}
//new Hashtable<>().put(null,null);
//"aa".charAt(1);
}
public static char checkscore(int score) throws Exception {
if(score < 0 || score >100){
throw new Exception("分数不合法"); //在程序不满足某种条件时,主动抛出一个异常对象,程序就不能继续向下执行
}
else if(score >= 90){
return 'A';
}
else if(score >= 80){
return 'B';
}
else{
return 'C';
}
}
}
package exception;
//自定义异常
public class ThrowText2 {
public static void main(String[] args) {
try {
char res = checkscore(110);
System.out.println(res);
} catch(ScoreException e){
e.printStackTrace();
System.out.println(e.getMessage());
}
//new Hashtable<>().put(null,null);
//"aa".charAt(1);
}
public static char checkscore(int score) throws ScoreException{
if(score < 0 || score >100){
throw new ScoreException("分数不合法"); //在程序不满足某种条件时,主动抛出一个异常对象,程序就不能继续向下执行
}
else if(score >= 90){
return 'A';
}
else if(score >= 80){
return 'B';
}
else{
return 'C';
}
}
}
package exception;
public class ScoreException extends Exception{
public ScoreException() {
}
public ScoreException(String message) {
super(message);
}
}
网络编程
网络编程概述
什么是计算机网络
把不同区域的计算机通过通信设备和线路连
接起来,实现数据的传输和共享的系统。
实现不同计算机之间的联系,必须有介质连接。
网络编程是干什么
(借助计算机网络,实现所写的程序,在不同的电脑上,可以进行数据传输)
聊天--->聊天软件
Java语言是支持网络间的数据传输的。将底层的细节封装起来了,给程序员提供了一套标准的类库,很方便使用Java语言开发出可以进行网络通信的软件。
网络编程核心问题
如何找到网络世界中的目标主机,以及目标软件
(win+r cmd ipconfig 查看自己电脑的IP)
如何安全可靠的进行数据传输(协议,即规则)
网络的一些基本知识
网络模型
OSI参考模型,是一个理想化的标准模型
分成7层
实际上的使用:Tcp/ip网络模型
分成4层
应用层(http)
运输层(协议)
网络层(IP)
物理层(硬件设备)
网络传输数据为什么要分层
在不同的层中,对数据加入不同的头(协议,IP),逐层分工
网络通信要素(IP:找主机 ; 端口:找程序 ; 协议)
目标主机,目标软件(IP+端口)
IP:在网络世界中,是计算机的地址
局域网地址,连接到路由器,会自动分配IP
广域网地址,家里的宽带,与外界连接
本机地址,本地回环地址(127.0.0.1)
端口:是计算机中运行中的程序的编号,对应的是程序
端口号: 0-65535 之间,但由于 0-1024 被一些系统程序使用,因此自己开发的程序为 1024-65535 之间,但是不能与已有的端口冲突
通信协议:如何安全传输协议
为了安全可靠地进行数据传输,需要对传输内容、速率、出错后的处理办法等进行控制,而制定的一些规约。
传输层的两个主要协议:
TCP(传输控制协议)
使用TCP协议进行数据传输前,必须先检测网络是否通畅,客户端是否能连接到服务器端,如果能连接到,则进行数据传输,如果连接不到,会报错
连接采用三次握手的机制
是可靠的,相对UDP效率低
断开采用四次握手机制
UDP(用户数据报协议)
将数据封装成一个一个数据报,数据报中包括数据源(自己电脑IP)、目标(接收端IP端口),发送前不需要建立连接,只管发送,是否成功不知道,是不安全的,但效率高
示例:
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerPro {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept(); //监听是否有客户端连接到服务器,监听时,会阻塞程序
while(true){
//接受客户端的信息
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String s = dataInputStream.readUTF();
System.out.println("客户端说:"+s);
//向客户端回发消息
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream); //数据流处理,输出字符串
Scanner scanner = new Scanner(System.in);
System.out.println("服务器端输入:");
String s1 = scanner.next();
dataOutputStream.writeUTF(s1);
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("服务器启动失败,端口被占用");
}
}
}
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class ClientPro {
public static void main(String[] args) {
//创建客户端
try {
Socket socket = new Socket("127.0.0.1",9999);
while(true){
//向服务器发送信息
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream); //数据流处理,输出字符串
Scanner scanner = new Scanner(System.in);
System.out.println("客户端输入:");
String s = scanner.next();
dataOutputStream.writeUTF(s);
//接受服务器的消息
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String s1 = dataInputStream.readUTF();
System.out.println("服务器端说:"+s1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}