失败,是正因你在距成功一步之遥的时候停住了脚步。
1、介绍
public class Demo {
public static void main(String[] args) {
// 1.类型转换错误
//String s = "123";
//Integer i = (Integer) s;
// 在Java中使用特殊类描述这些错误:Error 错误(根据不同场景,会使用不同子类提示)
// 尽量避免出现,出现JVM无法自行解决
// 2.递归没有跳出逻辑(栈溢出错误:java.lang.StackOverflowError)
//test();
// 异常:偏离程序正常逻辑
// 3.使用空对象(空指针异常:java.lang.NullPointerException)异常
User user = null;
System.out.println(user.toString());
// Java中异常分类为两大类
// 3.1 可以通过代码恢复正常逻辑执行的异常,称之为运行期异常:RuntimeException
// 3.2 不可以通过代码恢复正常逻辑执行的异常,称之为编译期异常:Exception(系统连接数据库,数据库没开,出现错误提示)
}
public static void test(){
test();
}
}
class User{}
2、基础语法
public class Demo {
public static void main(String[] args) {
// 异常处理语法:
/*
try:尝试
catch:捕捉
捕捉多个异常的时候,先捕捉异常范围小的异常,在捕捉范围大的异常
finally:最终
try{
可能会出现异常的代码
如果出现异常,JVM会将异常进行封装,形成一个具体的异常类,然后将这个异常抛出
所有的异常对象都可以被抛出
} catch(抛出的异常对象 对象引用(先捕捉异常范围小的,在捕捉范围大的)){
异常的解决方案
} catch(){
} finally {
最终执行的代码逻辑
}
*/
// 异常除数为零
//int i = 0;
//int j = 10 / i;
//System.out.println(j);
int i = 0;
int j = 0;
try {
j = 10 / i;
}catch (ArithmeticException e){
//e.getMessage();//错误信息
//e.getCause();//错误的原因
e.printStackTrace();//打印堆栈信息
// 可以对c错误的代码做处理
i = 10;
j = 10 / i;
} finally {
System.out.println("最终执行的代码");
}
// 最终结果
System.out.println(j);
}
}
3、常见异常
3.1、算术异常
java.lang.ArithmeticException
public class Demo {
public static void main(String[] args) {
// 运行期异常:JVM不会做出提示和处理,运行报错了,代码逻辑处理就可以了
// 例1:除数为0的算术异常:java.lang.ArithmeticException
// 通过代码逻辑解决
int i = 0;
if (i != 0) {
int j = 10 / i;
}
}
}
3.2、空指针异常
java.lang.NullPointerException
public class Demo {
public static void main(String[] args) {
// 例2:空指针异常:java.lang.NullPointerException
// 调用了一个为空(null)对象的成员属性或成员方法时,就会发生异常
// 通过代码逻辑解决
User user = null;
//if (user != null) {
// System.out.println(user.toString());
//}
// 通过异常解决,发现代码中造成这里为空的原因(早有异常早解决)
try{
System.out.println(user.toString());
} catch (NullPointerException e){
System.out.println("对象为空,需要分析数据为空的原因");
}
}
}
class User {}
3.3、索引越界异常
java.lang.ArrayIndexOutOfBoundsException
public class Demo {
public static void main(String[] args) {
// 例3. 索引越界异常:java.lang.ArrayIndexOutOfBoundsException
String[] names = new String[3];
names[0] = "zhangsan";
names[1] = "lisi";
names[2] = "wangwu";
// 通过程序逻辑解决异常
if(names.length == 4){
names[3] = "zhaoliu";//没有索引3
}
}
}
3.4、字符串索引越界
java.lang.StringIndexOutOfBoundsException
public class Demo {
public static void main(String[] args) {
// 例4. 字符串索引越界:java.lang.StringIndexOutOfBoundsException
String s = "abc";
System.out.println(s.charAt(3));
}
}
3.5、格式化异常
java.lang.NumberFormatException
public class Demo {
public static void main(String[] args) {
// 例5. 字符串转数字异常 格式化异常:java.lang.NumberFormatException
String s = "a123"; // 想要自己做处理,需要使用正则表达式,已实现校验
// Integer i = Integer.parseInt(s);
}
}
3.6、类型转换异常
java.lang.ClassCastException
public class Demo {
public static void main(String[] args) {
// 例5.类型转换异常:java.lang.ClassCastException
Object obj = new User();
// 代码解决:使用instanceof比较类型是否相同
if (obj instanceof Emp) {
Emp emp = (Emp) obj;
}
}
}
class User {}
class Emp {}
4、抛出异常
public class Demo {
public static void main(String[] args) {
//
User user = new User();
user.test(10,0);
}
}
class User {
// 如果方法中可能会出现问题,就需要提前声明,告诉其他人,我的方法会出现问题
// throws关键字 抛出运行时异常,调用者处理或不处理都可以
// 如果程序中需要手动抛出异常对象,使用try{}catch(){借助throw关键字,new出异常对象}处理异常,调用者必须处理异常
public void test(int i, int j) throws ArithmeticException{
try {
System.out.println(i / j);
} catch (ArithmeticException e){
throw new ArithmeticException();
}
}
}
5、自定义异常
public class Demo {
public static void main(String[] args) {
// 登录操作
String account = "zhangsan";
String password = "123123";
try {
login(account, password);
} catch (AccountException e){
System.out.println("账号不正确,需要重新修正");
} catch (PasswordException e){
System.out.println("密码不正确,需要重新修正");
}
}
public static void login(String account, String password) {
if (!"admin".equals(account)) {
throw new AccountException("账号不正确");
}
if (!"admin".equals(password)) {
throw new PasswordException("密码不正确");
}
}
}
class AccountException extends LoginException {
public AccountException(String message) {
super(message);
}
}
class PasswordException extends LoginException {
public PasswordException(String message) {
super(message);
}
}
// 自定义异常
// 继承RuntimeException,属于运行时异常(不需要任何操作),继承Exception,属于编译时异常(必须处理异常)
// 异常挨个抛出,也可以抛出它们的父类
class LoginException extends RuntimeException {
public LoginException(String message) {
super(message);
}
}