Java网络编程、异常

网络编程

一,网络通信三要素

ip地址:用于标识网络中的计算机设备

格式:xxx.xxx.xxx.xxx,每一段的范围0~255

端口号:用于标识计算机中的应用

格式:ip地址:端口号

取值范围:0~65535

常见的端口号:8080、3306、1521

通信协议:网络通信时要遵守的规则

常见的协议:TCP、UDP

1.1 UDP

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

特点:

  1. 不可靠的

  2. 效率高

  3. 单次发送数据的大小64K

  4. 应用场景:在线视频

在代码中的特点:发送的数据必须和目标地址一同封装在数据包中

核心类:DatagramSocket、DatagramPacket

1.2 TCP

传输控制协议(Transmission Control Protocol)

特点:

  1. 可靠(三次握手)

  2. 效率低

  3. 单次发送数据的大小没有限制

  4. 应用场景:聊天、下载

在代码中的特点:通过输入输出流来完成通信

核心类:ServerSocket服务端、Socket客户端

1.3 InetAddress

在java.net中的一个用于获取网络相关信息的类

常用静态方法:

  1. getLocalhost():获取本机的InetAddress对象

  2. getByName(String s):获取指定域名或者ip地址的InetAddress对象

二,异常

2.1 异常的体系结构

Java中程序在运行期间所发生的不正常情况就是异常,系统将各种异常封装成了一种数据类型--异常类Exception

Throwable:

  1. Throwable 类是 Java 语言中所有错误或异常的超类。

  2. 只有是Throwable或者它的子类对象才能使用throw关键字抛出

  3. 只有是Throwable或者它的子类才能的catch参数的类型

Exception:Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

Error:ErrorThrowable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。

2.2 异常处理的方式 throws

关键字:throws

格式:

范围修饰符 返回类型 方法名(参数列表) throws 异常类{
 方法体
} 

作用:抛出异常类,告知调用者当前方法存在异常

问:为什么抛出异常并没有实质上的解决掉异常还需要进行抛出

答:因为对于同一个异常来说,处理的方式可以各不相同,所以不在发生异常的方法中处理,而在调用处,由调用者决定如何处理

注:

  1. 抛出的异常类必须是所发生的异常或者它的父类

  2. 如果父类方法没有抛出异常,子类重写也不能抛出异常

  3. 如果抛出的异常是RuntimeException或者它的子类,那么调用者可以不做处理;反之,必须处理

2.3 异常处理的方式 try-catch

格式1:

try{
​
}catch(异常类 对象){
​
}

格式2:

try{
​
}finally{
​
}

格式3:

try{
​
}catch(异常类 对象){
​
}finally{
​
}

格式说明:

  1. try代码块中是可能发生异常需要进行检查的语句

  2. try代码块中一旦发生了异常会立即进入到catch代码块中,如果try中没有异常则不进入catch

  3. finally代码块中的代码一定会执行,通常用于释放资源

  4. catch代码中的异常类只能是try中所发生的异常或者它的父类

多个异常的处理方式:

  1. 多个异常一次处理

    Random r = new Random();
    int[] arr = {0,1,2,3};
    try {
        System.out.println(10 / arr[r.nextInt(6)]);
    }catch (Exception e){
        System.out.println("出错了");
    }
    // 使用Exception类接收所有异常情况,好处就是方便,弊端是无法明确发生的是具体哪一种异常
  2. 多个异常分别处理

    Random r = new Random();
    int[] arr = {2,1,0,3};
    try {
        int index = r.nextInt(6);
        System.out.println(index);
        System.out.println(10 / arr[index]);
    }catch (ArrayIndexOutOfBoundsException e){
        System.out.println("集合下标越界");
    }catch (ArithmeticException e){
        System.out.println("除0了");
    }

    注:

    1. 如果多个catch后的异常类没有继承关系,那么它们的位置顺序是任意的

    2. 如果多个catch后的异常类有继承关系,那么父类异常必须在子类异常之后

    3. 可以在多个catch后添加上Exception来处理没有捕获到的异常

    Random r = new Random();
    int[] arr = {2,1,0,3};
    try {
        System.out.println(arr.length);
        int index = r.nextInt(6);
        System.out.println(index);
        System.out.println(10 / arr[index]);
    }catch (ArrayIndexOutOfBoundsException e){
        System.out.println("下标越界");
    }catch (ArithmeticException e){
        System.out.println("除0了");
    }catch (NullPointerException e){
        System.out.println("空指针了");
    }catch (Exception e){
        System.out.println("未知异常");
    }

2.4 finally的使用

FileOutputStream fos = null;
try {
 fos = new FileOutputStream("C:\\users\\86151\\Desktop\\demo.txt");
 fos.write("哈哈哈".getBytes());
}catch (FileNotFoundException e){
 System.out.println("文件路径找不到");
}catch (IOException e){
 System.out.println("写入动作发生异常");
​
}finally {
 try{
     if(fos != null){
         fos.close();
     }
 }catch (IOException e){
     System.out.println("关闭资源发生异常");
 }
}

注:无论try、catch中返回的是什么,只要finally中有返回,返回结果一定是finally中的

2.5 异常的处理的方式 throw

throw关键字用于抛出异常对象,表示当满足某种异常情况时需要调用者对抛出的异常对象进行处理

public static void f(int[] a ,int index1,int[] b,int index2,int len){
 if(index1 >= a.length){
     ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException("a的下标超过了a的最大下标");
     System.out.println(e.hashCode());
     throw e;
 }
 if(index2 >= b.length){
     ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException("b的下标超过了b的最大下标");
     System.out.println(e.hashCode());
     throw e;
 }
 if(index1 + len > a.length){
     throw new ArrayIndexOutOfBoundsException("获取的数量超过了a的最大下标");
 }
 if(index2 + len > b.length){
     throw new ArrayIndexOutOfBoundsException("获取的数量超过了b的最大下标");
 }
 for(int i = index1;i < index1 + len;i++){
     b[index2] = a[i];
     index2++;
 }

2.6 自定义异常类

步骤:

  1. 定义类继承Exception

  2. 定义无参构造函数和重载一个参数是String类型的构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值