throws和throw的基本用法
主动向外抛出一个异常,目的就是告诉调用者我丢了一个异常,需要你处理一下。见代码:
class NoValueException extends Exception
{
NoValueException(String msg)
{
super(msg);
System.out.println("出现了负数");
}
}
public class Compute {
//定义一个只做正数加法运算的函数
static void add(int a,int b) throws NoValueException
{
if(a<0||b<0)
{
throw new NoValueException("出现负数");
}
System.out.println("答案:"+(a+b));
}
}
public class TestDemo {
public static void main(String[] args) {
try {
Compute.add(5, -1);
}catch(NoValueException e)
{
e.printStackTrace();
System.out.println("计算不正确");
}
}
}
throw定义在方法中,throws抛给调用者,需要和方法名同行
抛异常的注意事项
抛异常可以同时抛多个异常,就是声明给调用者,这段代码可能会有多个异常产生,需要你每个异常都需要考虑到并且处理一下,但是处理异常的时候我们需要注意处理异常的顺序,见代码:
class AException extends Exception{//Exception是一级异常,A是第二级
}
class BException extends AException{//B是第三级异常
}
class CException extends BException{//C是第四级异常
}
public class Compute {
static int state=1;
static void func()throws AException,BException,CException,Exception {
if(state==1)
throw new AException();
if(state==2)
throw new BException();
if(state==3)
throw new CException();
}
}
public class TestDemo {
public static void main(String[] args) {
try {
Compute.func();
}catch(CException e)//处理最低一级异常
{
e.printStackTrace();
}
catch(BException e)
{
e.printStackTrace();
}
catch(AException e)
{
e.printStackTrace();
}
catch(Exception e)//处理最高一级异常
{
e.printStackTrace();
}
}
}
很好理解这样的做法,子类异常肯定包括在父类异常之中,既然你直接处理了父类异常了,那么子类的异常就算处理了,但是父类是一个大概的,子类会更加具体。所以我们往往需要从具体到抽象的顺序进行处理嘛
总结
thorw写在方法里面,throws写在方法同行,对于throws抛出的异常,调用者需要注意一下处理异常的顺序









网友评论