使用throw关键字会把一个异常类抛出,转到异常处理程序去处理。但是如果throw后面的语句没有错误,如何在处理完毕之后回到throw后面继续执行后面正确的代码?
class ExceptionDemo1
{
public void in(int )
{
try
{
if(>100)throw new Exception("分数太高");
if(<0)throw new Exception("分数太低");
System.out.println("分数是:"+);
}
catch(Exception e)
{
System.out.println("您输入了错误的分数。");
}
}
public static void main(String args[])
{
ExceptionDemo1 aa=new ExceptionDemo1();
aa.in(30);
aa.in(200);
aa.in(89);
System.out.println("程序执行完毕,退出.");
}
}
如果真的不能继续执行后面的代码,那还要throw干吗?干脆if...else算了。不如写成
if(>100)
System.out.println("输入的分数太高");
else if(<0)
System.out.println("输入的分数太低");
else
System.out.println("您输入的分数是"+);

解决方案 »

  1.   

    我的目的是能够把
    aa.in(89);
    正确输出.
      

  2.   

    既然你已经打算把异常抛出, 说明你的程序已经在异常状态下运行, 那么合理的逻辑是中断当前异常的运行情况, 转到处理异常的部分,为何要明知道程序运行的前提是错的 还要继续运行呢? 就像你上面的程序, 明明分数已经太高, 不符合后面输出的规范了, 为何还要继续运行后面的代码。 至于为何要把异常抛出, 这里其实是有很较多讲究的, 这里简单说一个方面。 比如我有个类A的方法a() 调用了类B的 in(int ) 方法。而A的a()方法又被类C的c()调用, 现在因为B的in(int )发生异常导致C的c()方法执行不成功。 这样如果你只打印System.out.println("输入的分数太高"); 那我怎么知道错误发生的源头在哪里呢? 而用throw抛出异常的话就可以保存一个方法的调用栈,追查到错误发生的源头。 在真实的项目中, 程序往往不是你一个人写的,像你这样的写法称作吃掉了异常, 会使程序十分难以维护和调试。 关于异常的处理有很多学问和技巧,很值得研究。
      

  3.   

    感谢楼上所做的回答。但是我还是不明白,虽然说已经出了个200分,但是程序仍然还有正确的代码嘛,既然是进行错误处理,那么处理完毕之后就应该继续执行正确的程序才对呀。不然的话错误处理还有意义吗?是的,通过使用throw可以追到出错的源头,但是就不能说程序就不能继续进行了。书上所说:处理异常具有两个优点,第一、可以修复错误。第二、可以防止程序自动终止。但是通过上面的程序代码我却感觉不到这两点。第一、程序没有修复错误,仅仅是做了一个简单的说明。第二、程序还是自动终止了。
      

  4.   

    你对程序中止的理解有些狭隘, 防止程序中止是说不让程序crash掉, 而不是让你的方法在遇到异常的时候还可以继续运行下去。 因为一个方法里的操作应该是建立在一个合法的前提下的,所以一旦方法的运行前提出现异常, 理所当然的, 方法不应该继续的运行下去。 如果你的程序设计成当出现异常后方法还能执行, 说明设计本身存在问题。throw不是说把异常直接抛给用户不做任何处理, 而是抛给适合处理异常的层。 比方说, 一个程序有一层专门处理数据库的访问, 有一层专门处理业务逻辑。 这样如果数据库访问出现异常,比如说连接不可用,合理的做法是中断当前数据库操作, 并把错误抛给业务逻辑处理层。 让业务处理层handle这个异常, 比方说可以提示用户再次登陆, 再次确认数据库连接, 确认网络是否正确连通...。 而不是自己把异常处理掉错误, 如果这样做的话, 业务逻辑层的程序员就会很纳闷, 为什么我写的代码看似没有问题, 运行也正常, 但是操作没有反映到数据库中呢?
      

  5.   

    我想知道你in中的这几句为什么要用try和catch啊?
      

  6.   

    异常处理 应该用来处理执行期的不可预知的错误,不该用来设计程序结构导向的。这是我在 think in java 里看到的。
    你这的 in 不该用异常的。
      

  7.   

    throw出的异常是给client捕获用的, 你这样的写法实在是匪夷所思
      

  8.   

    感谢大家给我的帮助。这是书上的源代码,是让读者理解throw的作用的。其实你们所说的我有点大概理解了。使用java是可以进行多层应用开发的。那么在服务器端出现的异常是需要客户端进行处理。那么是不是使用throw就必须在声明方法的时候使用throws来指定服务当中有可能出现异常?需要在客户端通过try catch捕获?我的理解对吗?