编译是检测语法错误
程序在运行过程中出现的错误叫异常
异常是JDK所提供的类
//java 编译器要求你强制对这个可能出现的异常进行捕捉
//怎样区分是uncheck exception还是check exception?
//如果是Exception的子类不是RuntimeException的子类是checked Exception,
//否则是Exception的子类同时是RuntimeException的子类那么就是unchecked Exception
例子:
class checkException
{
public static void main(String[] agrs)
{
try
{
int i = 1 / 0;
//如果程序出错,出错后的代码不执行
}
catch (Exception e)
{ //如果程序出错回到catch里执行
e.printStackTrace();
}
finally
{
//无论程序是否出错都执行
System.out.println("finally是程序的出口");
}
}
}
广义异常包括Error 和 Exception,程序员对error异常无能为力一旦出现error虚拟机就关闭,而程序时运行在虚拟机上,对异常的处理体现了程序的健壮性,不能因为一点异常就导致整个程序崩溃。
我们把可能出现异常的代码放在try块中,把对异常捕捉的代码放在catch块中,把清理资源的代码放在finally中。
生成异常对象抛出异常
例子:
class User
{
private int age;
public void setAge(int age)
{
if(age < 0)
{
//生成异常对象
RuntimeException e = new RuntimeException("年龄不能为负数");
//抛出异常终止程序运行
throw(e);
}
this.age = age;
}
}
class Test
{
public static void main(String[] args)
{
User u = new User();
u.setAge(-1);
}
}
结果:
对于异常是虚拟机无法辨识的,比如年龄是负数等异常,我们需要告诉虚拟机要抛出异常,我们可以生成一个一场对象用throw抛出这个异常对象,java虚拟机运行到这的时候就知道啊这出现异常了;但是一般我们不会对自己抛出的异常做处理,我们需要声明异常,让调用它的函数进行捕捉和处理。
class User
{
private int age;
public void setAge(int age) throws Exception
{
if(age < 0)
{
//生成异常对象
RuntimeException e = new RuntimeException("年龄不能为负数");
//抛出异常终止程序运行
throw(e);
}
this.age = age;
}
}
class Test
{
public static void main(String[] args)
{
User u = new User();
try
{
u.setAge(-1);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
对于checked Exception 我们有两种做法
1:声明异常,在函数后面加throws,让调用它的函数来处理。
2:用try catch将会出现异常的代码