异常
问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述。并封装成对象。其实就是Java对不正常情况进行描述后的对象体现
Throwable
|--Error //严重错误,无法处理
|--Exception //不严重的问题,可以处理
|--RuntimeException //运行时异常
异常的处理
try块内,某语句产生异常,其后的语句都不会被执行。异常经常经过处理后,程序会继续向下执行(try块外)
/**
异常的处理
*/
class ExceptionTest
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(3, 0);
System.out.println(x);
}
catch(Exception e)
{
//jvm默认就是调用printStackTrace()方法
e.printStackTrace();
}
}
}
class Demo
{
int div(int a, int b)
{
return a/b;
}
}
finally:
关闭资源代码,确保资源的释放
System.exit(0); //直接退出程序,finally语句块不会执行
编译时异常与运行时异常
异常分两类:
1)编译时被检测的异常,编译时异常
2)编译时不被检测的异常,运行时异常(RuntimeException类及其子类)
对于编译时异常:
只有Java提供了编译时异常,并强制程序处理所有编译时异常,体现了Java的严谨,但为程序员带来了一些烦琐,关于编译时异常时Java领域备受争议的话题
运行时异常:
如果在函数内抛出运行时异常,函数上可以不用声明,编译一样通过
如果在函数上声明了运行时异常,调用该函数可以不用进行处理,编译一样通过
为什么会这样?
因为Java根本就不想让你处理RuntimeException异常(处理指抛出或者try),因为处理异常后,程序会继续执行,当发生RuntimeException异常时,Java希望程序停掉
throw与throws
throw:在方法内抛出异常对象
throw所在的语句块中,throw后不能再有语句,因为执行不到,像return一样,编译会失败
throws:在方法上声明异常,可以有多个异常,用逗号隔开
在方法上声明异常,便于提高安全性,让调用者进行处理,不处理则编译失败,调用声明了异常的方法时,要么throws抛出,要么try处理
/**
*/
class ExceptionTest2
{
public static void main(String[] args) throws Exception
{
Demo d = new Demo();
int x = d.div(3, 1);
System.out.println(x);
}
}
class Demo
{
int div(int a, int b) throws Exception
{
return a/b;
}
}
多异常处理
声明异常时,建议声明更为具体的异常,这样处理的可以更具体
对方声明几个异常,就对应有几个catch块,不要定义多余的catch块,如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面,否则会编译失败,因为父类异常在最上面,下面的子类异常永远不会得到执行
/**
多异常处理
*/
class ExceptionTest3
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4, 0);
}
catch(ArithmeticException e)
{
e.printStackTrace();
}
catch(ArrayIndexOutOfBoundsException e)
{
e.printStackTrace();
}
}
}
class Demo
{
int div(int a, int b) throws ArithmeticException, ArrayIndexOutOfBoundsException
{
int[] x = new int[a];
//可能出现两个异常:角标越界、b为0
return x[a]/b;
}
}
自定义异常类
/**
自定义异常类
*/
class ExceptionTest4
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4, 0);
System.out.println(x);
}
catch(NegativeException e)
{
e.printStackTrace();
}
System.out.println("over");
}
}
//自定义异常类,继承Exception
class NegativeException extends Exception
{
NegativeException(String msg)
{
super(msg);
}
}
class Demo
{
int div(int a, int b) throws NegativeException
{
if(b <= 0)
throw new NegativeException("出现负数了"); //手动抛出自定义异常对象,方法上就要throws声明这个异常
return a/b;
}
}
方法重写时的异常特点
如果父类的方法抛出异常,子类的重写方法只能抛出父类方法的异常或者该异常的子类
如果父类方法抛出多个异常,子类的重写方法只能抛出父类异常的子集
如果父类方法没有异常抛出,子类的重写方法也不可以抛出异常,只能try处理异常
---------------------- ASP.Net+Android+IOS开发</a>、 .Net培训、期待与您交流! ----------------------