JAVA SE学习day_07:异常处理、TCP通信
一、异常中常见的方法
public static void main(String[] args) {System.out.println("程序开始了");try {String str = "";/** 当我们将一个字符串解析为基本类型时,如果字符串内容不能正确* 表示基本类型值时,就会抛出NumberFormatException*/System.out.println(Integer.parseInt(str));} catch (Exception e) {System.out.println("出错了!");//输出错误堆栈信息,便于debuge.printStackTrace();//获取错误消息String message = e.getMessage();System.out.println(message);}System.out.println("程序结束了");}
二、自定义异常
通常自定义异常用在符合语法但是不符合业务逻辑问题时的异常。
- 自定义异常最重要的就是名字,要做到见名知意
自定义异常实现步骤:: - 1:定义类名
- 2:继承Exception(直接或间接继承)
- 3:提供所有构造方法
- 4:定义序列化版本号(避免代码出现警告)
public class IllegalAgeException extends Exception{/*** 序列号*/private static final long serialVersionUID = 1L;
/*
*右键选中Source后选定Generate Constructors from Superclass...
*生成下列内容
*/public IllegalAgeException() {super();// TODO Auto-generated constructor stub}public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);// TODO Auto-generated constructor stub}public IllegalAgeException(String message, Throwable cause) {super(message, cause);// TODO Auto-generated constructor stub}public IllegalAgeException(String message) {super(message);// TODO Auto-generated constructor stub}public IllegalAgeException(Throwable cause) {super(cause);// TODO Auto-generated constructor stub}}
三、throw(异常的抛出)
throw关键字用于主动对外抛出一个异常
通常以下两种情况会主动抛出异常:
* 1:满足语法,但是不满足业务逻辑要求(当前案例一就是这个情况)。
* 2:当前方法确实执行时出现了异常,但是当前方法不应该处理这个异常时,可以抛出给调用当前方法的代码片段去处理。
public void setAge(int age) throws IllegalAgeException {if(age<0||age>100) {/** 当我们使用throw抛出一个异常时(除了RuntimeException及其子类型* 异常)编译器要求我们必须处理该异常。而这里处理异常的方式就是在* 当前方法上使用throws声明该异常的抛出*/throw new IllegalAgeException("年龄不合法!");}this.age = age;}
当调用一个含有throws声明异常抛出的方法时,编译器要求我们必须定义处理异常的手段,而处理异常有两种方式:
* 1:使用try-catch捕获其抛出的异常
* 2:在当前方法上继续使用throws声明该异常的抛出。
具体使用哪种视处理异常的责任而定,需要当前代码片段处理的就try-catch 否则就继续往外抛。但是永远不应当在main方法上声明throws。
public static void main(String[] args) {System.out.println("程序开始了...");Person p = new Person();/** 满足语法,但是不满足业务逻辑要求*/try {p.setAge(10000);} catch (IllegalAgeException e) {e.printStackTrace();}System.out.println("今年:"+p.getAge()+"岁");System.out.println("程序结束了...");}
四、throws
子类重写父类含有throws声明异常抛出的方法时,重写throws的一些特殊规则
public class ThrowsDemo {public void dosome() throws IOException,AWTException{}}class SubClass extends ThrowsDemo{允许抛出父类所有的异常public void dosome() throws IOException,AWTException{ }允许不再抛出任何异常public void dosome(){}允许仅抛出父类方法抛出的部分异常public void dosome() throws IOException{}允许抛出父类方法抛出异常的子类型异常public void dosome() throws FileNotFoundException{}不允许抛出额外的异常(父类方法没有抛出的异常,也不是子类型异常)public void dosome() throws SQLException{}不允许抛出父类方法抛出异常的父类型异常public void dosome() throws Exception{}}
五、TCP通信的实现
java.net.Socket 套接字
Socket封装了TCP协议的通讯细节,使用它就可以与服务端建立网络连接了,并且进行通讯。这里的通讯是以两条流的读写完成与服务端的数据交换的。
Socket提供的方法:
* OutputStream getOutputStream()
* 通过socket的该方法获取的输出流写出的字节会通过网络发送给远端计算机。
* InputStream getInputStream();
* 通过该方法获取的输入流读取的字节是远端计算机发送过来的字节
客户端实例化Socket时需要传入两个参数:
- 1:服务端的地址信息(IP)
- 2:服务端打开的端口
服务端使用的是ServerSocket
它有两个作用:
* 1:向系统申请端口。
* 2:接收请求该端口的所有客户端的连接。
实例化ServerSocket
实例化的同时向系统申请服务端口,客户端Socket就是通过这个端口与服务端建立连接的。
* 如果该端口被系统其他程序占用了则会抛出异常:
* java.net.BindException:address already in use: JVM_bind
*
* 遇到该错误时解决办法:
* 1:首先检查是否自己开启过两次服务端,因为第一次启动已经占用了 该端口,如果再启动一遍时还申请该端口就会提示被占用了。
* 2:如果没有启动过两次,那说明系统其他程序占用该端口了,需要更换一个可用的。
ServerSocket提供的方法:
* Socket accept()
* 该方法是一个阻塞方法,调用该方法后程序"卡住",此时开始等待客户端的连接,一旦客户端实例化Socket并连接服务端这边申请的端口(8088)时,accept方法会立即返回一个Socket实例,此时等于和客户端建立了连接。服务端通过返回的这个Socket就可以与客户端进行交互了。
* 多次调用accept方法可以接收多个客户端的连接。
5.1聊天室客户端
package socket;import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;/*** 聊天室的客户端* @author 毛**/
public class Client {/** java.net.Socket 套接字* Socket封装了TCP协议的通讯细节,使用它就可以与服务端建立网络连接了,* 并且进行通讯。这里的通讯是以两条流的读写完成与服务端的数据交换的。*/private Socket socket;/*** 客户端构造方法,用于初始化客户端*/public Client() {try {/** 实例化Socket时需要传入两个参数:* 1:服务端的地址信息(IP)* 2:服务端打开的端口* * 我们可以通过IP找到网络上的服务端计算机,通过其打开的端口* 可以连接到服务端应用程序。*/System.out.println("正在连接服务端...");socket = new Socket("localhost",8088);System.out.println("已连接服务端!");} catch (Exception e) {e.printStackTrace();}}/*** 客户端开始工作的方法*/public void start() {try {/** Socket提供的方法:* OutputStream getOutputStream()* 通过socket的该方法获取的输出流写出的字节会通过网络发送给远端计算机。*/OutputStream out = socket.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");BufferedWriter bw = new BufferedWriter(osw);PrintWriter pw = new PrintWriter(bw,true);Scanner scanner = new Scanner(System.in);while(true) {String message = scanner.nextLine();pw.println(message);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Client client = new Client();client.start();}
}
5.2聊天室服务端
package socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;/*** 聊天室的客服端* @author 毛**/
public class Server {/** 服务端使用的是ServerSocket* 它有两个作用:* 1:向系统申请端口。* 2:接收请求该端口的所有客户端的连接。*/private ServerSocket server;/*** 服务端构造方法,用来初始化服务端*/public Server() {try {/** 实例化的同时向系统申请服务端口,客户端Socket就是通过这个端口与服务端建立连接的。* 如果该端口被系统其他程序占用了则会抛出异常:* java.net.BindException:address already in use: JVM_bind* * 遇到该错误时解决办法:* 1:首先检查是否自己开启过两次服务端,因为第一次启动已经占用了* 该端口,如果再启动一遍时还申请该端口就会提示被占用了。* 2:如果没有启动过两次,那说明系统其他程序占用该端口了,需要更* 换一个可用的。 */System.out.println("正在启动服务端...");server = new ServerSocket(8088);System.out.println("服务端启动完毕!");} catch (IOException e) {e.printStackTrace();}}/*** 服务端开始工作的方法*/public void start() {try {/** ServerSocket提供的方法:* Socket accept()* 该方法是一个阻塞方法,调用该方法后程序"卡住",此时开始等待* 客户端的连接,一旦客户端实例化Socket并连接服务端这边申请的* 端口(8088)时,accept方法会立即返回一个Socket实例,此时等于* 和客户端建立了连接。服务端通过返回的这个Socket就可以与客户端* 进行交互了。* 多次调用accept方法可以接收多个客户端的连接。*/System.out.println("等待客户端连接...");Socket socket = server.accept();System.out.println("一个客户端连接了!");/** Socket提供的方法:* InputStream getInputStream();* 通过该方法获取的输入流读取的字节是远端计算机发送过来的字节*/InputStream in = socket.getInputStream();InputStreamReader isr = new InputStreamReader(in,"UTF-8");BufferedReader br = new BufferedReader(isr);String message = "";while((message = br.readLine())!=null) {System.out.println("客户端说:"+message);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Server server = new Server();server.start();}}
JAVA SE学习day_07:异常处理、TCP通信相关推荐
- 第一阶段Java SE学习概述
Java SE学习概述 Java SE 学习分为五个阶段 第一部分:基础程序设计: 第二部分:面现象对象编程: 第三部分:Java SE 高级应用: 第四部分:JavaSE 新特性: 第五部分:MyS ...
- JAVA SE学习day_08:TCP通信、多线程(并联)
为了解决在程序中不同客户端在同一服务端中都可以进行数据发送的情况,要使用多线程将其进行并联操作 一.多线程 线程可以并发执行多个代码片段,使得这些代码片段直接运行是互不干涉的: 创建线程有两种方式, ...
- Java SE 学习记录——进阶版11
@学习记录 开始学习Java 遵从同学的指导,从Java se开始学习 黑马的JavaSE零基础入门[网络编程] 第一章 网络编程入门 1.1 软件结构 22-02 软件结构 1.2 网络通信协议 2 ...
- JAVA客户端数据传输_java模拟TCP通信实现客户端上传文件到服务器端
java模拟TCP通信实现客户端上传文件到服务器端,供大家参考,具体内容如下 客户端 package com.zr; import java.io.FileInputStream; import ja ...
- JAVA SE学习笔记(七):终章:Java程序设计基础笔记(全10万字)
Java程序设计入门 copyright © 2020 by 宇智波Akali 目录 文章目录 第1章 J ...
- Java SE 学习笔记5 Java阶段复习
计算机.Java基础 一.计算机 1.硬件介绍 2.中央处理器 3.比特(bit)和字节(byte) 4.内存 5.存储设备 6.输入和输出设备 二.Java介绍 1.常用的dos命令 2.java语 ...
- Java SE 学习记录06
@学习记录 开始学习Java 遵从同学的指导,从Java se开始学习 黑马的JavaSE零基础入门 day06-01 面向对象 package day06;import java.util.Arra ...
- 一个编程小白的Java SE学习日志 Ⅵ——继承【极客BOY-米奇】
文章目录 前言(转载请说明作者!)3.25~3.29编写 自我问答 任务导引:电子宠物Beta 任务UML图 继承 什么是继承? 如何实现继承? 案例 子类可以继承父类所有的成员和方法? 继承的特点 ...
- QT学习笔记(TCP 通信)
TCP 通信 TCP 简介 TCP 协议(Transmission Control Protocol)全称是传输控制协议是一种面向连接的.可靠的. 基于字节流的传输层通信协议. TCP 通信必须先建立 ...
最新文章
- [NOIp 2013]货车运输
- 干货 | 算法工程师入门第二期——穆黎森讲增强学习(一)
- PHP预防XSS攻击,ajax跨域攻击的方法
- mybatis与mysql的优点_MyBatis的优缺点以及特点
- Django ==》 内置信号
- feign 能干什么:
- C++中类的6个默认成员函数
- 全志A33-串口SLIP的使用
- SQL Server类型与C#类型对应关系
- iOS-国家代码选择功能github开源分享
- 计算机835真题,《计算机水平考试》复习题835题(含答案)
- Python全栈(四)高级编程技巧之4.元类编程、迭代器和生成器
- 搞懂PDCA循环,学会闭环思维
- 三星手机性能测试软件,Exynos4210处理器性能测试_三星 I9100 GALAXY SII(16GB/黑色)_手机Android频道-中关村在线...
- 如何使用PDF Expert将文本添加到PDF?
- Jumserver安装日志审计和资产管理
- 蓝桥杯练习题(数列排序)
- ASCII 控制码说明
- 手动实现promise基础功能代码并测试自己写的promise库是否符合规范
- linux驱动学习的磕磕碰碰
热门文章
- 两套代码详解LSTM-RNN——有记忆的神经网络
- python functools.wraps functools.partial实例解析
- php面试题之五——MySQL数据库(基础部分)
- 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布...
- C#--动态操作DataTable
- 数据库集群和高可用解决方案
- 处理WCF异常的方式
- 解决 iframe 在 ios 上不能滚动的问题
- Android项目中出现的Plugin with id ‘kotlin-android‘ not found解决方法
- Kali Linux 2019.4发布了!解决Kali Linux 2019.4中文乱码问题