捕获处理
try catch finally
try
{
//用于包裹可能发生异常的代码,其后面必须跟catch或finally
}
catch(数据类型 变量名)//可能有多个
{
//用于捕获某种try中引发的异常,并且执行引发此异常的代码
}
finally
{
//必须执行的代码部分
}
异常和错误的区别
异常:程序在各种复杂甚至是极端过程中产生的不正常的情况
处理方式: 异常处理
错误:程序编写时存在硬伤,导致问题不解决将无法正常执行
处理方式: 修改代码
编译器异常和运行期异常
编译期异常:必须在编译之前进行处理的异常(直接继承自Exception)
运行期异常:可以不去主动处理的异常(继承自RuntimeException的异常)
例:判断下列异常是编译期异常还是运行期异常
java.lang.NullPointerException
java.lang.ArrayIndexOutOfBoundsException
java.lang.ArithementException
java.lang.ParseException
java.lang.ClassCastException
故只有java.lang.ParseException 为编译期异常
异常的抛出处理
throw关键字
自定义异常
1.创建异常对象
例:创建人类对象,包含姓名,年龄,性别,当年龄大于120岁时引发异常
自定义异常
public class InformationException extends RuntimeException
{
public InformationException(String message)
{
super(message);
}
}
不满足要求时抛出异常
class Person
{
private String name;
private int age;
private String sex;
public void setName(String name)
{
this.name = name;
}
public void setAge(int age)
{
if(age<120)
this.age = age;
else
{
InformationException ie = new InformationException("年龄输入为"+age+"岁,不符合要求");
throw ie;
}
}
public void setSex(String sex)
{
this.sex = sex;
}
@Override
public String toString()
{
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
public class B
{
public static void main(String[] args)
{
Person person = new Person();
try
{
person.setAge(121);
} catch (Exception e)
{
e.printStackTrace();
}
person.setName("小王");
person.setSex("男");
System.out.println(person);
}
}
结果
例
创建一个商品类
1.商品名称(String)
2.过期日期(LocalDate)要求不能小于当前日期
3.重量(Double)不能为0或负数
自定义异常
public class OutOfNormalException extends RuntimeException
{
public OutOfNormalException(String message)
{
super(message);
}
}
抛出异常
import java.time.LocalDate;
class Good
{
private String name;
private LocalDate localDate;
private double weight;
public void setName(String name)
{
this.name = name;
}
public void setLocalDate(LocalDate localDate)
{
if(localDate.isAfter(LocalDate.now()))
this.localDate = localDate;
else
{
OutOfNormalException outOfNormalException = new OutOfNormalException("日期不符合要求");
throw outOfNormalException;
}
}
public void setWeight(double weight)
{
if(weight>0)
this.weight = weight;
else
{
OutOfNormalException outOfNormalException = new OutOfNormalException("重量不符合要求");
throw outOfNormalException;
}
}
@Override
public String toString()
{
return "Good{" +
"name='" + name + '\'' +
", localDate=" + localDate +
", weight=" + weight +
'}';
}
}
public class C
{
public static void main(String[] args)
{
Good good = new Good();
try
{
good.setLocalDate(LocalDate.now().minusDays(1));
good.setName("商品1");
good.setWeight(10);
System.out.println(good);
} catch (Exception e)
{
e.printStackTrace();
}
Good good1 = new Good();
try
{
good1.setLocalDate(LocalDate.now().plusDays(1));
good1.setName("商品二");
good1.setWeight(0);
System.out.println(good1);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
2.throw关键字
import java.time.LocalDate;
class Good
{
private String name;
private LocalDate localDate;
private double weight;
public void setName(String name)
{
this.name = name;
}
public void setLocalDate(LocalDate localDate)
{
if(localDate.isAfter(LocalDate.now()))
this.localDate = localDate;
else
{
OutOfNormalException outOfNormalException = new OutOfNormalException("日期不符合要求");
throw outOfNormalException;
}
}
public void setWeight(double weight)
{
if(weight>0)
this.weight = weight;
else
{
OutOfNormalException outOfNormalException = new OutOfNormalException("重量不符合要求");
throw outOfNormalException;
}
}
@Override
public String toString()
{
return "Good{" +
"name='" + name + '\'' +
", localDate=" + localDate +
", weight=" + weight +
'}';
}
}
public class C
{
public static void main(String[] args)
{
Good good = new Good();
try
{
good.setLocalDate(LocalDate.now().minusDays(1));
good.setName("商品1");
good.setWeight(10);
System.out.println(good);
} catch (Exception e)
{
e.printStackTrace();
}
Good good1 = new Good();
try
{
good1.setLocalDate(LocalDate.now().plusDays(1));
good1.setName("商品二");
good1.setWeight(0);
System.out.println(good1);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
结果
throw和throws的区别
- throw用在方法体内,throws用在方法声明后
- throw后面跟的是异常对象且只能跟一个,throws后面跟的是异常类且可以跟多个
- throw抛出的异常由方法体内的语句处理(try-catch),throws抛出的异常由方法的调用者处理
- 4.执行throw一定抛出异常,执行throws只是表示异常的一种可能性,不一定抛出异常
两者都是消极的处理异常的方式,只是对异常进行抛出而不处理,真正处理异常的为方法的调用者