一.异常的介绍
特点:
特点:
二. 异常举例以及解决常见错误bug方案
三.RuntimeException
这样刚才那个异常生成的可执行文件(Class),说明此异常为执行时异常的子类(RuntimeException)。
异常类有两个主要的子类:IOException
类和 RuntimeException
类。
1.运行时异常
2.非运行时异常
四. 捕获异常 try catch
1.定位一个代码块的异常,运行完成这个代码块后,抛出这个代码块的异常
快捷键: 选中对象使用Ctrl+Alt+t
// try表示监控区域
try {
// 监控对象
System.out.println(1 / 0);
// catch表示捕获异常,()Exception内表示异常类型,e表示异常对象
} catch (Exception e) {
// 捕获成功后,输出语句
throw new RuntimeException(e);
}
如果没有throw new RuntimeException(e);或e.printStackTrace();语句,就不抛出与输出异常语句。
2.try catch可以搭配finally使用
// try表示监控区域
try {
// 监控对象
System.out.println(1 / 0);
// catch表示捕获异常,()Exception内表示异常类型,e表示异常对象
} catch (Exception e) {
// 捕获成功后,输出语句
e.printStackTrace();
// finally表示善后工作,可以不写,因为默认存在。
// 但在一些情况中,必须写,如io流,资源,等等
} finally {
System.out.println("善后工作");
}
3.捕获错误
public class TestOne {
@Test
public void testOne() {
// 这段代码可以理解为创建了一个 TestOne 类的对象,并调用了该对象的 one() 方法。
// 具体来说,new Test() 创建了一个 Test 类的匿名对象,并通过该对象调用了 one() 方法。
// 这种方式常用于一次性调用某个类的方法而不需要保留对象的引用。
new TestOne().one();
}
public void one() {
two();
}
public void two() {
one();
}
}
public void testOne() {
try {
new TestOne().one();
} catch (Error e) {
System.out.println("虚拟机出现错误");
} finally {
System.out.println("善后工作");
}
}
public void one() {
two();
}
public void two() {
one();
}
四.多层捕获
如果不知道异常类型可以使用多层捕获,但括号中的捕获类型必须从小到大。
public void testOne() {
try {
System.out.println(1/0);
} catch (Exception e) {
System.out.println("Exception");
} catch (Error e) {
System.out.println("Error");
} catch (Throwable e) {
System.out.println("Throwable");
} finally {
System.out.println("善后工作");
}
}
五.NullPointerException空指针异常
空指针异常的情况:
六.抛出异常 throws
抛出异常: throw,throws,一般在方法中使用
public class TestOne {
@Test
public void testOne() {
new TestOne().test(1,0);
}
public void test(int one,int two) {
if(two == 0) {
// two等于0,就抛出异常
throw new ArithmeticException();
}
}
}
throws
public class TestOne {
@Test
public void testOne() {
new TestOne().test(1,0);
}
// 如果方法中,处理不了这个异常,那就方法上抛出异常
public void test(int one,int two) throws ArithmeticException {
if(two == 0) {
// two等于0,就抛出异常
throw new ArithmeticException();
}
}
}
七.自定义异常
自定义异常一般由企业里的架构师负责。
1.第一步:创建ErrorCode
接口。
public interface ErrorCode {
/**
* 获取错误码
* @return
*/
String getcode();
/**
* 获取错误信息
* @return
*/
String getMsg();
}
2.创建MyCodeEnum
枚举类,编写代码实现接口中的所有方法。
public enum MyCodeEnum implements ErrorCode{
// 错误端口与信息
NOT_FOUND_PAGE("404","找不到网站资源"),
NOT_FOUND_FILE("888","找不到文件"),
NOT_O_TEN("bad", "只能求10以内的加法")
;
// 此处必须有一个code,Msg
private final String code;
private final String Msg;
// 有参构造
MyCodeEnum(String code, String msg) {
this.code = code;
Msg = msg;
}
// 实现接口中的所有方法
@Override
public String getcode() {
return code;
}
@Override
public String getMsg() {
return Msg;
}
}
3.创建MyException
类继承Exception
public class MyException extends Exception{
// 有参构造,参数为自己写的异常接口与调用接口的getMsg方法(获取错误信息)
public MyException(ErrorCode errorCode) {
super(errorCode.getMsg());
}
}
4.使用异常
public class TestOne {
public int sum(int a,int b) throws MyException {
if(a > 10 || b > 10 || a < 0 || b < 0) {
// 抛出自己写的异常MyException,参数为错误信息为自己写的MyCodeEnum
throw new MyException(MyCodeEnum.NOT_O_TEN);
}
return a+b;
}
@Test
public void testOne() {
// 自己写的异常,继承Exception,就必须使用try catch捕获
try {
sum(10,33);
} catch (MyException e) {
throw new RuntimeException(e);
}
}
}