黑马程序员技术交流社区

标题: 异常 try catch中为什么会这样? [打印本页]

作者: 158803629    时间: 2015-7-25 22:44
标题: 异常 try catch中为什么会这样?
  1. public class FinallyTest1 {

  2.     public static void main(String[] args) {
  3.         
  4.         System.out.println(test1());
  5.     }

  6.     public static int test1() {
  7.         int b = 20;

  8.         try {
  9.          

  10.             return b += 80;
  11.         }
  12.         catch (Exception e) {

  13.          
  14.         }
  15.         finally {
  16.             
  17.             
  18.         }
  19.         
  20.        // return b;     //为什么次行的return注释掉后会报错,14行不是已经有return语句了吗,为什么这里还要加上呢??
  21.     }
  22.    
  23. }
复制代码
14行不是已经有return语句了吗,为什么25行不加return会报错

作者: lizhichao    时间: 2015-7-25 22:44

首先你应该明确try catch 的作用
1:try 检测异常:
2:catch 是捕捉异常;后面的{}

一旦trycatch就说明这个问题没有抛给调用者这个就得函数自己处理;一般这种函数在遇到运行时异常的时候不会停止;但是你的return被catch绑架后你得去救他。
如果你的程序里 return b += 80; 出错 被catch捕捉后没有相应的处理没有返回。(注意有返回值类型的函数一定要遇到return才会停止并反回)那么程序的调用者会很无语,你说有int 的返回你至少也应该返回一个 int数代表来表示出错了吧,结果调用程序以后就石沉大海了(函数找不到return了return被catch逮住了了)你说有定义了int而不能返回int 的函数吗?。(一般int会返回-1位出错标志)所以建议你的return写在catch里来处理;
  1.          public static void main(String[] args) {
  2.                 
  3.                 System.out.println(test1());
  4.             }

  5.             public static int test1() {
  6.                 int b = 20;

  7.                 try {
  8.                 

  9.                     return b = 80/0;
  10.                 }
  11.                 catch (Exception e) {;
  12.                  return -1 ;
  13.                 }
  14.                 finally {
  15.                    
  16.                    
  17.                 }
  18.                 
  19.                // return b;     //为什么次行的return注释掉后会报错,14行不是已经有return语句了吗,为什么这里还要加上呢??
  20.             }
  21. }
复制代码



2:catch捕捉异常后会有相应的处理。只是检测不捕捉处理 问题抛不出去。return不就照样执行了吗?
你还是把异常的多练习练习吧

作者: 158803629    时间: 2015-7-25 22:46
本帖最后由 158803629 于 2015-7-25 22:50 编辑

public class FinallyTest1 {

    public static void main(String[] args)
        {
        
        System.out.println(test1());
    }

    public static int test1()
        {
        int b = 20;

        try
                        {
            return b += 80;
            }

        finally
                        {  
            }
        
       // return b;     //如果把catch语句拿掉后,这里不加return又没有问题,不会报错! why
    }
}
作者: 158803629    时间: 2015-7-25 22:52
1楼代码中有两个 return语句 分别代表什么呢!

作者: boboyuwu    时间: 2015-7-26 10:46
我来回来  希望你满意 呵呵  因为test1()函数类型是int类型   所以函数下面必须return  int类型try下面的return
b=100返回给了text1()    这样tex1()直接就是100
作者: boboyuwu    时间: 2015-7-26 10:49
158803629 发表于 2015-7-25 22:46
public class FinallyTest1 {

    public static void main(String[] args)

看 定义了一个int 函数是必须return int值得不然肯定报错

1.png (2.38 KB, 下载次数: 19)

1.png

2.png (3.14 KB, 下载次数: 18)

2.png

作者: xiaoshaoye    时间: 2015-7-26 12:28
这是因为编译器认为try块中是又可能产生异常操作
的,也就是说在return语句之前如果出现异常的话,那么return语句根本没有机会得到执行,所以编译器会认为缺少return语句。
作者: 香港胖仔    时间: 2015-7-26 14:01
如果14行执行没成功catch中又没有return这个方法就没有返回值了
作者: wowthe1st    时间: 2015-7-26 14:44
因为有catch的时候,程序不会报错,会继续执行catch块的代码,既然没报错,那方法需要个返回值,如果try块出错,执行完catch块后没有返回值,自然有问题;
但是去掉catch后,如果try块出错,因为异常没有被捕获,直接就抛出异常了,自然就不需要返回了;

可以代码最后加上返回,也可以catch里面加上return语句,就都能编译通过;
作者: jack123    时间: 2015-7-28 23:59
没看出来你这个代码写的意义是什么?try catch这样用有点浪费系统资源耗费性能。原因很简单如果你写了catch块以后那么当try中的语句执行出现异常不能正常返回时那你的方法里就没有return(没有返回值)当然回报错 你如果把return关键字写在finally中这样就表示无论上述两个语句块中哪一个出了问题,都会执行其中的return。。。。。
作者: FateYin    时间: 2015-8-7 13:52
好问题啊,学习学习,看看是怎么回事。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2