- 异常
数组越界:ArrayIndexOutofBoundsException
字符串越界:StringIndexOutofBoundsException
空指针:NullPointerException
类型转换:ClassCastException
栈溢出:StackOverflowError
同步修改:ConcurrentModificationException
-
- Java程序中的错误
1.1.1语法错误
不符合Java的基本语法。编译时就不会通过!
如何解决???修改代码,符合Java语法。
1.1.2运行时错误
没有语法错误,可以通过编译,也可以执行。
执行时,会因为内部或外部的问题,导致程序无法运行而停止
可以解决的:
不可解决的:
解决方式:异常处理
1.1.3 逻辑错误
代码可以编译,也可以执行,也可以得到结果。
但是结果不正确!!!
解决方法:
- 梳理算法
- 代码实现是否与算法一致
- Debug-调试
让程序一步步地执行,查看执行状态
执行流程
变量的值
1.2异常的体系结构
1.2.1Throwable类
java中所有的可抛出的错误的父类。
子类:
1.Error类
代表的java中的错误
无法在代码中处理。
比如:
StackOverflowError类,表示栈溢出。方法的无限递归调用。
OutOfMemoryError类,表示内存溢出。
JVM天生的缺陷。JVM中的一些Bug。
2.Exception类
代表java中的异常。
这些异常都是可以预防的。
异常又可以分为两类:
1)检查时异常:编译时异常
这种异常必须进行处理,如果不处理,它会报语法错误。
所有的运行时异常,都不是RuntimeException的子类
2)非检查时异常:运行时异常。
不要求必须进行处理,不处理不会报语法错误。
所有的运行时异常,都是RuntimeException的子类
1.3.1捕获异常
使用try...catch...捕获异常。
语法:
try{
可能抛出异常的代码
}catch(异常的类型 变量){
异常处理的代码
}catch(异常的类型 变量){
异常处理的代码
}finally{
必定要执行的代码
}
执行过程:
1)尝试执行try后面的代码块。
2)如果抛出异常,代码块将停止执行,跳到catch检查抛出的异常和catch捕获的异常是否匹配,如果匹配,进入catch后的代码执行。
3)如果不匹配,再比较下一个catch。
4)如果try后的代码执行正常。则会跳过所有的catch。
5)无论trycatch是否抛出了异常,finally代码块总是会执行。
注意:
1)可以没有catch,也可以有多个catch,也可以没有finally,catch和finally至少有一个
2)当一个catch要捕获多个异常时,可以使用 | 来分割
3)catch后的异常不能重复出现,如果异常存在父子关系,必须把子类放前面
4)finally代码块,无论前面是否抛出异常,总会执行。包括return;除非System.exit().
1.3.2向上抛出
不在当前方法中处理异常,而是交给方法的调用者。
语法:
修饰符 返回值类型 方法名(参数列表)throws 异常类型1,异常类型2 {
方法体(包含可能出现异常的代码)
}
1.4自定义异常
1)定义异常要找一个异常类作为父类
2)抛出自定义异常需要使用throw关键字
第二章 IO流
2.1什么是流
数据流,数据从一个地方传输到另一个地方。
IO:Input/Output 输入/输出
2.1.1分类
1.流向
Input:输入流——数据由其他的地方流向程序内部。
Output:输出流——数据从程序内部,流向外部的其他地方。
参照物:程序
文件 读取文件的内容。。输入流
2.单位
字节流Stream:数据以字节为单位进行传输。
用于二进制数据的传输。比如文件、图片、安装程序。。。
字符流:数据以字符为单位进行传输。
用于文本数据的传输
3.组合分类
字节输入流:InputStream
子类:FileInputStream、ObjectInputStream
字节输出流:OutputStream
子类:FileOutputStream、ObjectOutputStream
字符输入流:Reader
子类:BufferedReader、FileReader
字符输出流:Writer
子类:BufferedWriter、FileWriter
装饰类(Buffered)不能独立使用,必须依赖于原始类(FileRead/FileWriter)
4.序列化与反序列化
序列化:将对象转换成二进制的流
反序列化:从二进制的流中读取对象。
类必须要实现Serializable接口
Transient修饰属性,会在序列化时忽略掉被修饰的属性
2.1.2File类
File.createTempFile() 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀
File.getAbsoluteFile()返回抽象路径名的绝对路径名形式