- 程序运行中可能产生的问题(异常的分类)
(1):严重的问题是Erro
(2):非严重的问题Exception
**编译期异常: 就是发生在编译期
**运行期异常:就是发生在运行期
(3):jvm对异常的处理方式,如果是main出现了问题
那么main可以使用自己的方式处理,如果main方法不做处理那么就将问题抛给 调用者。
处理方式一:使用try...catch(try中的代码越少越好;在catch中要给出处理方式,哪怕是一条输出语句,如果catch中的异常是平级
关系,那么与顺序无关,如果是有继承关系的,尽量不要放到大的catch中进行处理)
处理方式二:使用throws
(4):throws使用在方法之上的,用户异常的声明
throw是抛出一个异常,是用在方法中的,它不仅可以抛出编译期异常,还可以抛出运行期异常。
(5):finally:在代码中适中要执行的。一般存放的是释放资源的代码。被执行的前提是jvm不能退出。
2.final,finally,finalize之间的区别。
(1):final是一个修饰符,可以用来修饰类,方法,变量。
(2):finally是try...catch中的一部分,是始终被执行的代码,前提是jvm没有退出。
(3):finalize是与垃圾回收期有关,是Object中的一个方法。
3.自定义异常
就是自己定义异常,一般的情况下java中的异常可以满足大部分程序中出现的异常,但是有时候这些异常
满足不了我们的需求,这个时候需要我们自己定义异常。
(1):使用方法,第一步,写一个类继承Exception或者是RunTimeException,第二步是在类中写出无参数和有参数的构造方法。
(2):异常的注意事项:子类抛出的异常不能抛出比父类更大的异常,或者不抛出异常。子类不能抛出父类不存在的异常。或者不抛出异常。如果父类没有抛出异常,子类重写方法时不能抛出,只能在内部try...catch 。
4.IO流
(1):File类,file可以表示一个文件或者文件夹。
(2):关于File的方法,创建文件还是文件夹不是根据文件的后缀名来区别的,而是根据调用的方法来来创建的。如果没有写具体的路径,那么所创建的文件夹或者文件就在本项目中,
需要刷项目才能看到。如果想要创建指定目录下的文件夹或者文件需要自己不全路径。
(3):File中的delete方法是不走回收站的。只能删除单级文件夹,不能删除多级。
(4):重命名,renameTo,如果目标文件的路径是一致的,那么就是重命名,如果目标文件的路径不是一致的,那么就是先重命名后剪切。
(5):判断功能:
(6):file中获取功能相关的方法。
5.递归算法
递归算法:方法定义种调用本方法。递归一定要有出口,如果没有出口那就是死递归。而且递归的次数不能太多,如果次数太多就会栈内存溢出。
6.递归练习
(1)看见文件的路径首先要做的就是将路径封装为File对象。
(2)获取File文件或者文件夹对应的数组.
(3)遍历当前的数组,判断数组中的每一个元素、
**当前的元素是文件
判断文件的后缀名是否是以.java结尾
**当前的元素是文件夹,那么调用方法继续遍历。
7.IO流
什么是输入输出:输入和输出是站在内存的角度来看的。将硬盘上到内存中是输入(将硬盘上的数据输入到内存中,是对应的读取),从内存到硬盘上是输出(将内存中的数据写到硬盘上,是一个写的动作)。一般来讲我们平时所说的输入和输出
都是站在内存的角度来说的 。
8.IO流的分类
(1):按照数据的流向来分
**输入流
**输出流
(2):按照数据的类型来分
**字节流(可以操作任何数据)
**字符流(主要是针对中文,一个中文占两个字节,操作起来很方便)
(3):在开发中到底是使用字节流还是使用字符流,如果可以用Windwons自带的记事本打开,并且是可以、
读懂的,就使用字符流来操作,如果无法读懂那么就使用字节流来操作。
(4):按照操作数据类型
**字节输入流:inputStream
**字节输出流: outputStream
**字符输入流: Reader
**字符输出流: Writer
(5):需要注意的是流在使用完了一定要将流关闭,关闭的原因是将这个流的对象变成垃圾;通知系统释放关于该文件的资源,同时也防止了内存泄漏。。一旦流
被关闭了就不能对流进行操作了,因为它已经变成垃圾了。
(6):关于流的使用步骤
**创建流的对象
**调用读或者是写的方法
**关闭流
9.FileOutputStream中的方法
(1): write(byte [] bytes):一次写一个字节数组
(2): write(byte [] bytes ,int off,int len):一次写一个字节数组的一部分
(3): write(int by): 一次写一个字节。
(4):如果想要完成追加写入,在创建对象的时候传入一个boolean类型的值。
10.高效的字节输入输出流(一次读取一个字节数组)
(1):BufferedInputStream:高效的字节输入流。
(2): BufferedOutputStream:高效的字节输出流。
(3): 具体的使用步骤
**创建对象
**调用输入或者输出的方法
**释放资源
11.字符流
(1)字符流=字节流+编码表
(2)编码:就是将一个字符串转换为一个字节数组
**使用到的方法
getBytes(),默认使用的是GBK编码方式
getBytes(String charsetName),指定字符集将string编码到byte中。
(3)解码:就是将一个字节数组转换为一个字符串
**使用到的方法
String(byte[]bytes),解码指定的字节数组然后转换为字符串。默认是使用的是GBK.
String(byte[] bytes,String charsetName),指定解码方式,将字节数组转换为字符串。
******使用什么方式编码就使用什么方式解码。如果编码和解码的方式不统一,那么就会乱码。
(4)转化流
字符输入流 inputStreamReader
字符输出流 outputStreamWriter
flush():表示刷新缓冲区,刷新之后可以再次的写数据,但是close之后是不可以写数据的。
如果我们写的数据是比较少是可以不用刷新的,但是如果是写的数据很多,建议是写一部分刷新一部分,然后在close.转换输入流和输出流的便捷类。(原因:在使用转换流的时候流的名称是比较长的饿,操作起来不是很方便,并且不用指点编码方式,因此java提供了针对转化流提出了便捷类)
(1) 转换输入流 inputStreamReader 对应的便捷类 FileReader
(2) 转换输出流 outputStreamWriter 对应的便捷类 FileWriter
(3) 高效的字符输入流:BufferedReader
(4) 高效的字符输出流:BufferedWriter高效字符输入流特有的功能
(1):readLine():一次读取一行,line是表示一行,不包含换行符。
(2):newLine():里面带有换行,在window中或者一些高级的编辑器中都做了兼容。使用字符流复制文本文件的五种方式
(1) 使用便捷类一次读取一个字符(FileReader)
(2) 使用便捷类一次读取一个字符数组(FileReader)
(3) 使用高效的字符流一次读取一个字符(BufferedReader)
(4) 使用高效的字符流一次读取一个字符数组(BufferedReader)
(5) 使用高效的字符流一次读取一行(BufferedReader)数据输入流和数据输出流(输入和读取一些基本的数据)
(1) 数据输入流(DataInputStream)
(2) 数据输出流(DataOutputSream)内存操作流
(1) 操作字节数组
(2) 操作字符数组
(3) 操作字符串打印流
(1) 字节打印流 PrintStream
(2) 字符打印流 PrintWriter
**特有的功能(可以操作任意数据类型)随机访问流
(1) RandomAccessFile: 父类是Object ,内部维护这一个数组。最大的特点是可以读取也可以写数据,数据类型是任意类型的。网络模型的七层结构
(1) 物理层:定义物理设备的标准
(2) 数据链路层:从物理层接收MAC地址进行封装和节封装
(3) 网络层:主要是从下一层获取到IP地址进行封装和解封装
(4) 传输存:传输数据的端口和协议,从下一层接收到的数据进行分段和传输,当数据到达目的地的时候将数据进行重组。
(5) 会话层:主要是接收和发送请求
(6) 表示层:将数据进行解释,也就是将计算机能看懂的语言转化为我们能够看得懂的东西。
(7) 应用层:将数据展示在应用终端上。网络编程的三要素
(1) IP地址:计算机在网上的位置
(2) 端口号:标识我们的计算机的应用程序,分为物理端口和逻辑端口,物理端口一般指的是网卡,逻辑端口是标识进程的,在0~65535中是物流端口。
(3) 协议:数据传输规则
(4) UDP协议的特点:不需要建立连接,传输的速度快,不安全,不可靠,有大小的限制,一般是64k.
TCP协议的特点:需要建立连接,传输的速度慢,安全,可靠。没有大小的限制。网络编程(套接字编程,Socket编程)
(1) 基本的原理:Socket=IP地址+端口号。
(2) 应用程序的两端都有Socket,然后数据按照某种协议使用IO流的方式进行数据的传输。TCP协议
开发步骤
客户端 (1) 创建TCP通讯协议对象(Scoket)
(2) 获取输出流对象
(3) 写数据
(4) 释放资源
服务端 (1) 创建服务对象(ServerSocket)
(2) 监听客户端
(3) 获取输入流对象
(4) 读取数据
(5) 释放资源进程以及多线程概述。
(1) 什么是进程:就是现在正在运行的程序
(2) 多进程是可以提高CUP的利用率
(3) 什么是线程:一个程序有多个任务,每一个任务就是一个线程。线程存在的意义是提高应用程序的使用效率。他们的执行时随机的。
(4) 并发:就是在同一个时间点上执行。
(5) 并行:同一个时间段上执行。JVM的运行原理
当我们使用Java命令来运行程序的时候,程序要运行时就启动了一个JVM,而JVM就相当于一个进程,
在JVM启动时就自动开启了一个线程,而此时的线程就是一个主线程,主线程是在main方法中的,JVM是多线程的,至少存在两个线程
一个是主线程,一个是垃圾回收线程。多线程的实现方式。(方式一)
(1) 方式一
*** 定义一个类,让这个类继承Tthread
*** 冲写run()方法。重写run()方法的目的是将需要运行的代码放在里面。
*** 创建这个类的对象。
*** 启动线程。
(2) 获取线程的名称
*** getName():获取线程的名称
*** setName():设置线程名称
*** 通过构造方法,来写名称
(3) 线程的调度模型
*** 分时调度
*** 抢占式调度
*** 线程的最大优先级是10.最小是1,默认是5.
*** 线程的优先级的大小是表示抢占CUP的概率增大了,并不是一定获得了CUP的执行权。
*** 休眠线程 selp(),由于是静态方法,可以直接调用。
*** 加入线程 join() ,等待该线程停止之后在执行其他的线程。在启动之后再加入线程才能起作用。
*** 线程礼让 yiled(),礼让的时间非常短暂,如果这时候其他的线程还没有抢占CUP,那么就继续此线程继续和其他线程抢占。
*** 守护线程 setDameon(),如果其他的线程执行完了之后,剩余的线程都是守护线程,那么JVM就会直接退出。
*** 线程中断,是打断线程受阻状态,让程序继续执行,但是程序会抛出一个异常。多线程的实现方式二
(1)实现步骤
*** 创建一个类,让这个类去实现Runable,
*** 重写run()方法。
*** 创建该类的对象
*** 创建Thread类的对象,然后把3中的对象作为参数传递给Thread.
*** 使用Start()方法启动线程。
(2) 两种线程实现方式的比较
*** 两种方式都能实现多线程,但是第二种方式相对比第一种方式要好,因为第一种方式是单继承的,而第二种方式是通过
实现Runable接口来实现的,在接口中,继承是可以单继承,也可以是多继承,这样一定程度上避免了单继承带来的局限性。
(3) 获取当前线程对象
*** Thread currentThread
*** sleep 线程休眠判断一个多线程是否存在问题的标准
(1) 是否是多线程
(2) 是否存在共享数据
(3) 是否存在多条语句来共同操作数据(可以打乱)
*** 解决方案
把多条数据看做一个整体,当一个线程执行这个整体的时候,其他的线程不能只想这个整体,那就需要使用到(同步)代码块。
*** 使用到 synchronized(new object){},同步代码块解决安全问题,主要取决于同步代码块中的对象Object,这个Object需要带成员变量出声明为静态的。同步代码块
(1) 同步代码块解决线程安全问题主要是取决于同步代码块中的对象。要求多个线程必须使用的是同一个对象。对象有的时候也被称之为同步锁(监视器),它的弊端是效率低。
(2) 同步代码块锁对象是(任意对象)
(3) 同步方法的锁的对象是(this)
(4) 静态同步方法锁的对象是(线程类对应的字节码对象)反射
*** 什么是反射
反射是在Java运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。
对于任意一个对象,都能够调用它的任意一个方法和属性。
这种动态获取和动态调用对象的方法的功能叫做Java语言的反射着机制。
想要剖析一个类必须要先获得这个类的字节码文件。而剖析一个类就是使用的Class中的方法。
(1) 类加载器的分类
*** Bootstrap ClassLoader:是根加载器,主要是负责Java中核心部分类的加载
*** Extension ClassLoader:扩展类加载器,是负责JRE的扩展类加载
*** System ClassLoader:系统类加载器,负责在JVM启动之后加载Java命令的class文件。,以及classpath环境变量指定的jar包和路径。
(2) 获取字节码文件的方式
*** getClass()方法
*** 通过静态的class
*** 通过Class中静态的成员方法获取