1、异常
在程序运行中,出现的错误
Throwable:Throwable类是java语言中所有错误或者异常的超类
Exception、Error是Throwable的子类
-
Error
-
总是不可控制的
-
经常用来表示系统错误或者底层资源错误
-
如果可能的话,应该在系统级被捕捉s
比如:虚拟机错误、内存溢出、线程锁死
-
-
Exception
-
可以是可控的或者不可控的
-
表示一个由程序员导致的错误
-
应该在应用程序级被处理
分类:
-
运行时异常
可以编译通过,程序运行时报出来的异常
处理:
try { } catch(Exception e) { } finally { // 无论前面是否抛出异常,都会执行里面的语句 // 可以return覆盖前面的return值 }
在产生异常的方法里处理获取异常
- 产生的异常对象被catch里面的参数接收
- catch块中用来处理异常
- 如果异常被catch处理了,就不会往上抛出异常
- 如果异常被处理了,try{}catch后面的代码会接着执行
- 调用端不会感知异常的产生,因为内部已经处理完了
在调用端处理异常
- 异常会抛出到调用端,调用端try…catch处理
-
编译期异常
这个异常必须处理,否则没有办法通过编译
被调用的方法抛出异常,调用端必须做处理,否则会编译异常
被调用的方法可以准确的预测到这个代码可能发生的异常,这个是给调用者的一个警示,让调用者知道会发生这种异常
public [void] 方法名 (参数类型: 参数名) throw Exception { }
-
总结
运行期的异常:编译期不强制处理,运行期JVM将自动检测抛出
编译期的异常:在编译期强制被处理的异常
-
2、自定义异常
自己定义异常类型
public class MyException extends RuntimeException{
public MyException(String message) {
super(message);
}
}
public class Test2 {
public static void main(String[] args) {
Test2 test2 = new Test2();
test2.login();
}
public void login() {
// 业务
// 假设用户名密码错误
if(true) {
throw new MyException("账号或密码错误");
}
}
}
3、字符串
字符串不是基本数据类型,是类,是引用的数据类型
八种基本数据类型:byte、char、short、int、long、double、float、boolean
-
字符串常量
String str = "123"; Str += "456";
这里定义了一个字符串常量,常量是不可以改变的,即这个字符串是不能改变的,字符串常量是共享的,如果我们做字符串的拼接,那么就是产生了一个新的字符串
-
字符串的构造器
new String(“123”)如果在常量池中没有abc,则会在常量池中创建一个123的常量,并且在堆中创建一个字符串对象,同时又在常量池中创建一个字符串对象,然后在堆中的对象来引用字符串常量池中的对象。如果在常量池中存在123这个常量,那么堆直接引用这个常量的地址。
-
空字符串和null的区别
空字符串是有效的引用,有地址的,只不过内容的长度为0
null的引用是空的引用,不能使用,使用会报空指针异常
-
常用API
Modifier and Type Method and Description boolean
contains(CharSequence s)
当且仅当此字符串包含指定的char值序列时才返回true。boolean
endsWith(String suffix)
测试此字符串是否以指定的后缀结尾。boolean
equals(Object anObject)
将此字符串与指定对象进行比较。boolean
equalsIgnoreCase(String anotherString)
将此String
与其他String
比较,忽略案例注意事项。String
replace(char oldChar, char newChar)
返回从替换所有出现的导致一个字符串oldChar
在此字符串newChar
。String[]
split(String regex)
将此字符串分割为给定的 regular expression的匹配。boolean
startsWith(String prefix)
测试此字符串是否以指定的前缀开头。
4、StringBuffer
线程安全的可变字符串
线程:多个线程同时操作一个资源的时候,可能会发生数据安全问题
StringBuffer是线程安全的,创建后值可以变化,可以添加、修改、删除值,但不会改变地址,不会产生新的字符串
线程安全有利有弊,它提高了安全性,但是牺牲了性能
5、StringBuilder
非线程安全的可变字符串
用法和StringBuffer一样,只是StringBuilder是非线程安全的