Java——异常处理(详解)

定义概念:

所谓异常就是程序运行时可能出现的一些错误,比如试图打开一个根本不存在的文件、配置问题、错误输入等问题,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。语法错误和逻辑错误不是异常。

java异常处理过程
(1)当程序运行到某一句时,发生了异常,那么程序会先停下来
(2)程序会在这句代码处,查看原因,生成一个合理“异常对象”,然后“抛”出
(3)JVM会检测在这句代码的外围,是否有try…catch结构,可以“捕获”异常对象。

如果可以捕获,那么程序再处理完异常后,继续下面的运行,不会崩溃;
如果不能捕获,那么会把这个异常继续抛给“上级”,如果“上级”能处理,那么程序从“上级"处理完的代码后面继续运行;

如果上级也不能处理,那么继续往上抛,一直到达JVM,那么就“崩溃”

演示代码:

public static void main(String[] args) {
        int sum = 0;
        System.out.println("sum = " + sum);
        testInput();  //第18行代码
        System.out.println("main的其他代码");
    }

    public static void testInput(){
        Scanner input = new Scanner(System.in);
        try {
            System.out.print("请输入一个整数:");
            int num = input.nextInt(); //第24行代码
        } catch (ArrayIndexOutOfBoundsException e) {//获取数组越界异常对象
            System.out.println("输入有误");//这里 只是提醒,没有让他 重新输入
        }
        System.out.println("其他的代码");
    }

在这里插入图片描述

分析:
从第34行开始,由于输入不匹配,抛出输入不匹配异常对象,尽管有try…catch可以捕获异常对象,但是catch的是数组越界异常对象,因此无法捕获,于是将异常对象继续抛给上级。因为是在main函数调用的方法,于是就抛给了main函数(第18行),但是main函数也无法处理,于是继续抛给虚拟机,最终程序崩溃。

修改过后:

public static void main(String[] args) {
        int sum = 0;
        System.out.println("sum = " + sum);
        try {
            testInput();
        } catch (InputMismatchException e) {
            System.out.println("成功捕获异常对象");
        }
        System.out.println("main的其他代码");
    }

    public static void testInput(){
        Scanner input = new Scanner(System.in);
        try {
            System.out.print("请输入一个整数:");
            int num = input.nextInt();
        } catch (ArrayIndexOutOfBoundsException e) {//获取数组越界异常对象
            System.out.println("输入有误");//这里 只是提醒,没有让他 重新输入
        }
        System.out.println("其他的代码");
    }

在这里插入图片描述

异常类型

1、异常的公共父类:java.lang.Throwable
(1)只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句“抛”出。
(2)只有此类或其子类之一才可以是 catch 子句中的参数类型。

2、Throwable又分为两大派别:
(1)Error:错误
一般指严重错误,一般合理的应用程序不应该试图去捕获它。
如果出现这个问题,要么需要升级修改程序,要么需要升级架构,要么需要升级硬件。
例如:报了一个OutOfMemoryError
经典代表:VirtualMachineError(堆内存溢出OutOfMemoryError,栈内存溢出StackOverflowError)

(2)Exception:异常
一般异常,合理的应用程序应该试图去捕获它。

3、Exception还可以分为两大类:
(1)运行时异常(RuntimeException或它子类):又称为非受检异常。
编译时,编译器是不会提醒你做处理的,只有运行期间,才会发生。

运行时异常是不建议用try…catch,因为它发生频率太高,而且一般都是很不应该发生的问题。
例如:空指针异常,数组下标越界异常,类型转换异常等,这些异常完全可以避免掉。
但是如果实在没有考虑到,也可以通过try…catch处理。

(2)编译时异常,除了RuntimeException系列以外的,都是编译时异常。又称为受检异常。
编译时,编译器会强制要求程序员编写处理的代码,如果你不编写,那么就编译不通过。
例如:FileNotFoundException,IOException等
在这里插入图片描述

异常处理:

try…catch

1、格式:

 try{
		可能发生异常的代码
 }catch(异常类型1  异常对象名){//异常对象名绝大多数都是写e
 		处理这个异常的代码
 }catch(异常类型2  异常对象名){//异常对象名绝大多数都是写e
	处理这个异常的代码
}catch(异常类型3  异常对象名){//异常对象名绝大多数都是写e
		处理这个异常的代码
 }... ...

2、异常对象的常用方法
(1)e.printStackTrace();
打印异常的详细信息,包括对象跟踪信息,即这个异常对象一路经过了哪些方法
(2)e.getMessage();
返回异常对象中简单的错误信息提示

3、打印异常/错误信息
System.err.println(xx);打印错误信息(打印红色字体)
System.out.println(xx);打印正常信息

4、多个catch分支,如何匹配和执行的?
从上到下依次判断,一旦有一个满足,后面就不看了。
建议:如果多个catch中的异常类型有大小包含关系,那么小的在上,大的在下,如果没有大小包含关系,顺序随意。

5、如果catch,可以捕获try中发生的异常,那么程序,会从try…catch下面的代码继续运行 ,不会崩溃。
如果catch无法捕获try中发生的异常,那么就会导致当前方法结束,并把异常对象抛出调用者。
如果调用者可以处理,那么从调用者处理代码的后面继续运行,否则继续往上抛,最终到达JVM,程序就崩溃了。

演示代码:

//从命令行接收2个整数,求商
	public static void main(String[] args) {
		try {
			int a = Integer.parseInt(args[0]);//第一个参数赋值给a变量
			int b = Integer.parseInt(args[1]);//第二个参数赋值给b变量
			int shang = a/b;
			System.out.println(a +"/" + b + "=" + shang);
		} catch (NumberFormatException e) {
			e.printStackTrace();//标准的
      //System.err.println(e.getMessage());
      //System.out.println(e.getMessage());
		} catch (ArrayIndexOutOfBoundsException e){
			e.printStackTrace();
		} catch (ArithmeticException e){
			e.printStackTrace();
		} catch (Exception e){
			e.printStackTrace();
		} 				
		System.out.println("其他的代码....");
	}

在这里插入图片描述
在这里插入图片描述

try…catch finally

格式:

try{
	可能发生异常的代码
}catch(异常类型1  异常对象名){//异常对象名绝大多数都是写e
	处理这个异常的代码
 }catch(异常类型2  异常对象名){//异常对象名绝大多数都是写e
	处理这个异常的代码
}catch(异常类型3  异常对象名){//异常对象名绝大多数都是写e
	处理这个异常的代码
}
 ... ...
 finally{
	不管try中是否发生异常,也不管catch是否可以捕获异常,这里代码都必须执行
}

一般用于编写释放资源,断开连接等代码

特殊情况:可以没有catch部分

 try{	
}finally{
}

演示代码:

public static void main(String[] args) {
		try {
			int a = 1;
			int b = 0;
			System.out.println(a/b);
		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		} finally{
			System.out.println("最终块");
		}
	}

补:finally与return混用:

public static void main(String[] args) {
		int num = getNum(4);
		System.out.println(num);//0
	}
	
	public static int getNum(int a){
		int result = 10;
		try{
			System.out.println(a/0);
			if(a > 0){
				result = 20;
				return result;
			}else if(a < 0){
				result = -20;
				return result;
			}else{
				return result;
			}
		}catch(Exception e){
			System.out.println("exception");
			result = 0;
			return result;
		}finally{
			result = 30;
			System.out.println("finally");
       //return result;//如果有这句,结果就变成30
		}
	}

finally与return混用:

(1)不管try中是否发生异常,也不管catch是否可以捕获异常,也无论try或catch中是否有return。 finally中的代码都必须执行
(2)如果finally中有return,就从finally块的的return回去。
(3)如果finally中没有return,那么先把try或catch中该执行的执行完(包括把返回值的结果放到要带回调用处的操作数栈的位置),在return结束当前方法之前,先走一下finally,然后回去结束当前方法.

结论,如果finally中没有return,finally中的代码不影响返回值。

但是如果try-catch语句执行了程序退出代码,即执行System.exit(0);,则不执行finally子语句(当然包括其后的所有语句)

throws关键字

异常处理的方式之一:
在当前方法中直接用try…catch处理
异常处理的方式之二:
在当前方法中不处理,扔/抛给调用者处理(throws的作用)

格式:

【修饰符】 返回值类型  方法名(【形参列表】)throws 异常列表们{
}
说明:throws后面可以跟好几个异常,顺序无所谓,每一个异常之间使用,分割

throws的好处:
(1)throws:告知被调用者,我这个方法可能会抛出哪些异常,使得调用者可以明确的知道应该catch什么异常。
如果没有throws,那么调用者就不清楚,只能按照Exception处理,或者根据错误经验来处理。
2)编译时异常,如果在当前方法中不用try…catch处理,编译不通过,那么可以通过throws明确的说明,抛给调用者处理

演示代码:

public static void main(String[] args) {
			try {
				divide(1,1);
			} catch (ArithmeticException e) {
				e.printStackTrace();
			} catch (RuntimeException e) {
				e.printStackTrace();
			}
			
			try {
				copy("1.txt","2.txt");
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}			
	}
	
public static void divide(int a, int b)throws ArithmeticException,RuntimeException{
		System.out.println(a/b);
	}
	
public static void copy(String srcFile, String destFile) throws FileNotFoundException{
		FileInputStream fis = new FileInputStream(srcFile);//用来读取srcFile文件的内容
	}

关于方法重写时,对throws抛出的异常的要求:
子类重写的方法抛出的异常类型必须<=父类被重写的方法抛出的异常类型。
例如:
Exception > RuntimeException > ArrayIndexOutOfBoundsException

public static void main(String[] args) {

        Father f = new Son();//多态引用
        try {
            f.method();
        } catch (RuntimeException e) {
            e.printStackTrace();
        }

        Father f2 = new Son();
        Object str = f2.test();
    }

class Father{
    public void method()throws RuntimeException{
        //....
    }
    public Object test(){
        return null;
    }
}
class Son extends Father{
    @Override
    public void method()throws ArrayIndexOutOfBoundsException{
        //....
    }
    @Override
    public String test(){
        return "";
    }
}

throw关键字

异常的对象的创建和抛出有两种方式:
(1)JVM创建并抛出
(2)程序员new出来,然后由throw抛出。throw用于手动抛出异常对象。可以代替return语句,结束当前的方法。

 public static void main(String[] args) {
        Account a = new Account(100);
        try {
            boolean flag = a.withdraw(500);
            //如果没有异常,取款成功
            System.out.println("取款成功" + flag);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (RuntimeException e) {
            e.printStackTrace();
        }
    }
}

class Account {
    private double balance;

    public Account(double balance) {
        super();
        this.balance = balance;
    }

    public boolean withdraw(double money) {
        if (money < 0) {
            throw new IllegalArgumentException("取款金额" + money + "有问题,取款金额不能小于0");
        }
        if (money > balance) {
            throw new RuntimeException("余额不足");
        }
        balance -= money;
        return true;
    }
}

在这里插入图片描述

throw和throws什么区别?

(1)throw用于方法内部,手动抛出异常对象,是个可执行的语句。throws用于方法声明。
(2)throw后面抛出异常对象且只有一个,throws声明异常类型且可以是多种。

自定义异常

如果系统预定义的异常类型,
例如:ArrayIndexOutOfBoundsException
ClassCastException//类型转换异常
NullPointerException
ArithmeticException
InputMisMatchException
IllegalAugumentException

发现不能准确的表达你当前的异常类型的意思时,可以选择自定义一个异常类。

1、自定义的要求:
(1)必须继承Throwable或它的子类
但是实际开发中,一般继承RuntimeException和Exception

(2)建议保留两种构造器的形式
①无参构造
②带给父类的message属性赋值的构造器

2、如何使用自定义异常
只能使用throw语句进行手动抛出。它不能由JVM自动抛出。

3、建议
在自定义异常时,异常的类型名非常重要,见名知意。

演示代码:

 public static void main(String[] args) {
        Account a = new Account(100);
        try {
            a.withdraw(-100);
        } catch (MoneyCannotNegativeException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

//例如:声明一个异常类型,表示金额不能为负数
class MoneyCannotNegativeException extends Exception {

    public MoneyCannotNegativeException() {
        super();
    }

    public MoneyCannotNegativeException(String message) {
        super(message);
    }

}

class Account {
    private double balance;

    public Account(double balance) {
        super();
        this.balance = balance;
    }

    public boolean withdraw(double money) throws MoneyCannotNegativeException {
        if (money < 0) {
            throw new MoneyCannotNegativeException("取款金额" + money + "有问题,取款金额不能小于0");
        }
        if (money > balance) {
            throw new RuntimeException("余额不足");
        }
        balance -= money;
        return true;
    }
}

在这里插入图片描述

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2章:简单Java程序】_简单Java程序笔记.pdf 010301_【第3章:Java基础程序设计】_Java数据类型笔记.pdf 010302_【第3章:Java基础程序设计】_运算符、表达式与语句笔记.pdf 010303_【第3章:Java基础程序设计】_判断与循环语句笔记.pdf 010401_【第4章:数组与方法】_数组的定义及使用笔记.pdf 010402_【第4章:数组与方法】_方法的声明及使用笔记.pdf 010403_【第4章:数组与方法】_数组的引用传递笔记.pdf 010404_【第4章:数组与方法】_Java新特性对数组的支持笔记.pdf 020501_【第5章:面向对象基础】_面向对象、类与对象的定义笔记.pdf 020502_【第5章:面向对象基础】_类与对象的进一步研究笔记.pdf 020503_【第5章:面向对象基础】_封装性笔记.pdf 020504_【第5章:面向对象基础】_构造方法与匿名对象笔记.pdf 020505_〖第5章:面向对象基础〗_实例讲解—类设计分析(学生类)笔记.pdf 020506_【第5章:面向对象基础】_String类笔记.pdf 020507_【第5章:面向对象基础】_String类的常用方法.pdf 020508_【第5章:面向对象基础】_引用传递及其应用笔记.pdf 020509_【第5章:面向对象基础】_this关键字笔记.pdf 020510_【第5章:面向对象基础】_static关键字笔记.pdf 020511_【第5章:面向对象基础】_理解main方法笔记.pdf 020512_【第5章:面向对象基础】_代码块笔记.pdf 020513_【第5章:面向对象基础】_构造方法私有化笔记.pdf 020514_【第5章:面向对象基础】_对象数组笔记.pdf 020515_【第5章:面向对象基础】_内部类笔记.pdf 020516_〖第5章:面向对象基础〗_实例讲解—系统登陆笔记.pdf 020517_〖第5章:面向对象基础〗_实例讲解—单向链表(1)笔记.pdf 020518_〖第5章:面向对象基础〗_实例讲解—单向链表(2)笔记.pdf 020601_【第6章:面向对象(高级)】_继承的基本实现笔记.pdf 020602_【第6章:面向对象(高级)】_继承的进一步研究笔记.pdf 020603_〖第6章:面向对象(高级)〗_范例:继承的应用笔记.pdf 020604_【第6章:面向对象(高级)】_final关键字笔记.pdf 020605_【第6章:面向对象(高级)】_抽象类的基本概念笔记.pdf 020606_【第6章:面向对象(高级)】_接口的基本概念笔记.pdf 020607_【第6章:面向对象(高级)】_对象的多态性笔记.pdf 020608_【第6章:面向对象(高级)】_instanceof关键字笔记.pdf 020609_【第6章:面向对象(高级)】_抽象类与接口的应用笔记.pdf 020610_〖第6章:面向对象(高级)〗_实例分析:宠物商店笔记.pdf 020611_【第6章:面向对象(高级)】_Object类笔记.pdf 020612_【第6章:面向对象(高级)】_包装类笔记.pdf 020613_【第6章:面向对象(高级)】_匿名内部类笔记.pdf 020701_【第7章:异常的基本概念】_异常的基本概念笔记.pdf 020702_【第7章:异常的基本概念】_异常的其他概念笔记.pdf 020801_【第8章:包及访问控制权限】_包的定义及导入笔记.pdf 020802_【第8章:包及访问控制权限】_访问控制权限及命名规范笔记.pdf 030901_【第9章:多线程】_认识多线程笔记.pdf 030902_【第9章:多线程】_线程常用操作方法笔记.pdf 030903_〖第9章:多线程〗_线程操作范例笔记.pdf 030904_【第9章:多线程】_同步与死锁笔记.pdf 030905_【第9章:多线程】_线程操作案例——生产者和消费者笔记.pdf 030906_【第9章:多线程】_线程生命周期笔记.pdf 031001_【第10章:泛型】_泛型入门笔记.pdf 031002_【第10章:泛型】_通配符笔记.pdf 031003_【第10章:泛型】_泛型的其他应用笔记.pdf 031004_〖第10章:泛型〗_实例讲解—泛型操作范例笔记.pdf 031101_【第11章:Java常用类库】_StringBuffer笔记.pdf 031102_【第11章:Java常用类库】_Runtime类笔记.pdf 031103_【第11章:Java常用类库】_国际化程序笔记.pdf 031104_【第11章:Java常用类库】_System类笔记.pdf 031105_【第11章:Java常用类库】_日期操作类(Date、Calendar)笔记.pdf 031106_【第11章:Java常用类库】_日期操作类(DateFormat、SimpleDateFormat)笔记.pdf 031107_〖第11章:Java常用类库〗_实例操作:取得当前日期笔记.pdf 031108_【第11章:Java常用类库】_Math与Random类笔记.pdf 031109_【第11章:Java常用类库】_NumberFormat笔记.pdf 031110_【第11章:Java常用类库】_大数操作(BigIntger、BigDecimal)笔记.pdf 031111_【第11章:Java常用类库】_对象克隆技术笔记.pdf 031112_【第11章:Java常用类库】_Arrays笔记.pdf 031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)笔记.pdf 031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf 031202_【第12章:JAVA IO】_RandomAccessFile笔记.pdf 031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf 031204_【第12章:JAVA IO】_字节-字符转换流笔记.pdf 031205_【第12章:JAVA IO】_内存操作流笔记.pdf 031206_【第12章:JAVA IO】_管道流笔记.pdf 031207_【第12章:JAVA IO】_打印流笔记.pdf 031208_【第12章:JAVA IO】_System类对IO的支持笔记.pdf 031209_【第12章:JAVA IO】_BufferedReader笔记.pdf 031210_〖第12章:JAVA IO〗_IO操作实例笔记.pdf 031211_【第12章:JAVA IO】_Scanner笔记.pdf 031212_【第12章:JAVA IO】_数据操作流笔记.pdf 031213_【第12章:JAVA IO】_合并流笔记.pdf 031214_【第12章:JAVA IO】_压缩流笔记.pdf 031215_【第12章:JAVA IO】_回退流笔记.pdf 031216_【第12章:JAVA IO】_字符编码笔记.pdf 031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗_实例操作—单人信息管理程序笔记.pdf 031219_〖第12章:JAVA IO〗_实例操作:投票程序笔记.pdf 031301_【第13章:Java类集】_认识类集、Collection接口笔记.pdf 031302_【第13章:Java类集】_List接口笔记.pdf 031303_【第13章:Java类集】_LinkedList类笔记.pdf 031304_【第13章:Java类集】_Set接口笔记.pdf 031305_【第13章:Java类集】_排序及重复元素说明笔记.pdf 031306_【第13章:Java类集】_SortedSet接口笔记.pdf 031307_【第13章:Java类集】_Iterator接口笔记.pdf 031308_【第13章:Java类集】_ListIterator接口笔记.pdf 031309_【第13章:Java类集】_foreach及Enumeration接口笔记.pdf 031310_【第13章:Java类集】_Map接口笔记.pdf 031311_【第13章:Java类集】_Map接口使用的注意事项笔记.pdf 031312_【第13章:Java类集】_IdentityHashMap类笔记.pdf 031313_【第13章:Java类集】_SortedMap类笔记.pdf 031314_【第13章:Java类集】_集合工具类:Collections笔记.pdf 031315_【第13章:Java类集】_Stack类笔记.pdf 031316_【第13章:Java类集】_属性类:Properties笔记.pdf 031317_〖第13章:Java类集〗_范例讲解:一对多关系笔记.pdf 031318_〖第13章:Java类集〗_范例讲解:多对多关系笔记.pdf 031401_【第14章:枚举】_枚举的作用笔记.pdf 031402_【第14章:枚举】_Enum笔记.pdf 031403_【第14章:枚举】_类集对Enum的支持笔记.pdf 031404_【第14章:枚举】_枚举的其他应用笔记.pdf 031501_【第15章:Java反射机制】_认识Class类笔记.pdf 031502_【第15章:Java反射机制】_Class类的使用笔记.pdf 031503_【第15章:Java反射机制】_反射应用——取得类的结构笔记.pdf 031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统内建Annotation笔记.pdf 031602_【第16章:Annotation】_自定义Annotation笔记.pdf 031603_【第16章:Annotation】_反射与Annotation笔记.pdf 031604_【第16章:Annotation】_深入Annotation笔记.pdf 031701_【第17章:Java数据库编程】_JDBC概述笔记.pdf 031702_【第17章:Java数据库编程】_MySQL数据库笔记.pdf 031703_【第17章:Java数据库编程】_SQL语法基础笔记.pdf 031704_【第17章:Java数据库编程】_JDBC操作步骤及数据库连接操作笔记.pdf 031705_【第17章:Java数据库编程】_执行数据库更新操作笔记.pdf 031706_【第17章:Java数据库编程】_ResultSet接口笔记.pdf 031707_【第17章:Java数据库编程】_PreparedStatement接口笔记.pdf 031708_【第17章:Java数据库编程】_处理大数据对象(1)—处理CLOB数据笔记.pdf 031709_【第17章:Java数据库编程】_处理大数据对象(2)—处理BLOB数据笔记.pdf 031710_【第17章:Java数据库编程】_CallableStatement接口笔记.pdf 031711_【第17章:Java数据库编程】_JDBC 2.0操作笔记.pdf 031712_【第17章:Java数据库编程】_事务处理笔记.pdf 031713_【第17章:Java数据库编程】_使用元数据分析数据库笔记.pdf 031714_【第17章:Java数据库编程】_使用JDBC连接Oracle笔记.pdf 031801_【第18章:图形界面】_AWT、Swing简介笔记.pdf 031802_【第18章:图形界面】_基本容器:JFrame笔记.pdf 031803_【第18章:图形界面】_标签组件:JLabel笔记.pdf 031804_【第18章:图形界面】_按钮组件:JButton笔记.pdf 031805_【第18章:图形界面】_布局管理器笔记.pdf 031806_【第18章:图形界面】_其他容器笔记.pdf 031807_【第18章:图形界面】_不弹起的按钮组件:JToggleButton笔记.pdf 031808_【第18章:图形界面】_文本组件:JTextComponent笔记.pdf 031809_【第18章:图形界面】_事件处理笔记.pdf 031810_【第18章:图形界面】_单选钮:JRadioButton笔记.pdf 031811_【第18章:图形界面】_复选框:JCheckBox笔记.pdf 031812_【第18章:图形界面】_列表框:JList笔记.pdf 031812_【第18章:图形界面】_下拉列表框:JComboBox笔记.pdf 031813_【第18章:图形界面】_菜单组件笔记.pdf 031814_【第18章:图形界面】_文件选择框笔记.pdf 031815_【第18章:图形界面】_表格笔记.pdf 031901_【第19章:Java网络编程】_IP(Internet Protocol)与InetAddress笔记.pdf 031902_【第19章:Java网络编程】_URL与URLConnection笔记.pdf 031903_【第19章:Java网络编程】_URLEncoder与URLDecoder笔记.pdf 031904_【第19章:Java网络编程】_TCP程序设计笔记.pdf 031905_【第19章:Java网络编程】_UDP程序设计笔记.pdf 032001_【第20章:Java新IO】_缓冲区与Buffer笔记.pdf 032002_【第20章:Java新IO】_通道(Channel)笔记.pdf 032003_【第20章:Java新IO】_文件锁笔记.pdf 032004_【第20章:Java新IO】_字符集笔记.pdf 032005_【第20章:Java新IO】_Selector笔记.pdf 042101_【课程讲解】_附录:Eclipse开发工具笔记.pdf 050101_〖开发实例〗_Java开发实例讲解(人员管理)笔记.pdf

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuochaoHN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值