String f()
{
    String ret = null;
    try {
         ret = doSomeThing(); //执行可能抛出异常的操作
    }catch (Exception e)
    {
        return null;  //1
     }
     return ret;  //2
}
1>为什么捕捉到异常后不直接在1处返回呢?我发现它是从2处返回的。2>我把2处的返回写在try块中就没有问题。3>为什么我不使用e对象,也必需声明一个变量名么?不可以像C++中样catch (Exception)么?

解决方案 »

  1.   

    如果在try{}中出现异常,程序就运行catch{}中的程序,不会运行其他程序的。
      

  2.   

    如果按楼上所说,那么就应该没问题啊,
    String f()
    {
        String ret = null;
        try {
             ret = doSomeThing(); //执行可能抛出异常的操作
        }catch (Exception e)
        {
            return null;  //1
         }
         return ret.toString();  //2
    }
    那这样也没问题啊,可为什么会报我空指针异常呢?按理说应该不会执行到ret.toString的啊。
      

  3.   

    如果在try{}中出现异常,程序就运行catch{}中的程序,不会运行其他程序的
     
    再说了你的return null 是空啊
    还有 ret.toString();  你得抛出异常啊 没有的话就有空指针了
      

  4.   

    你的doTomeThing()抛出异常的话应该就没有返回值
    这时try里面的ret还是null
    null不会有toString();方法
    你最开始说是从2返回是怎么看出来的?关于问题3 需要。
      

  5.   

    你的doTomeThing()抛出异常的话应该就没有返回值
    ============================
    为什么没有呢?抛出异常后不是执行catch么?catch里不是有返回null么?返回一个null给String应该没问题吧?(只要我调用这个函数的程序会判断返回值就行了)你最开始说是从2返回是怎么看出来的?
    ===========================
    因为我发现在抛出异常后ret确实是null,但它还是去执行了ret.toString()操作。
    而这明显会有个Run-TimeNullPointException被抛出,但我并没有去catch.所以中止了程序。
      

  6.   

    楼主,我运行你的代码是好的呀。请把你不成功的代码贴出来看看先?
    package sss;
    public class a{
    public static void main(String[] args){
    ddd d=new ddd();
    System.out.println(d.f());
    }
    }
    class ddd{
    public String f()
    {
        String ret = null;
        try {
             ret = ret.toString(); //执行可能抛出异常的操作
        }catch (Exception e)
        {
         System.out.println("一处异常");
        
           return "dfdf";  //1
         }
         return ret;  //2
    }
    }
      

  7.   

    String f()
    {
        String ret = null;
        try {
             ret = doSomeThing(); //执行可能抛出异常的操作
        }catch (Exception e)
        {
            return null;  //1
         }
         return ret.toString();  //2
    }
    那这样也没问题啊,可为什么会报我空指针异常呢?按理说应该不会执行到ret.toString的啊。
    这段程序先运行1处的return,再运行2处的return,  ret为空,当然报指针异常啦!
      

  8.   

    to qzai2000() :
    还有运行两个return的说法???
      

  9.   

    to qzai2000() :
    还有运行两个return的说法???
    ====================================================================================
    有的吧
    return 只是退出它所在的最内层方法好像
      

  10.   

    这样第一二个问题比较容易看清楚String f()
    {
        String ret = null;
        System.out.println("========1========");
        try {
             System.out.println("========2========");
             ret = doSomeThing(); //执行可能抛出异常的操作
             System.out.println("========3========");
        }catch (Exception e)
        {
            System.out.println("========4========");
            return null;  //1
            System.out.println("========5========");
         }
         System.out.println("========6========");
         return ret;  //2
         System.out.println("========7========");
    }
      

  11.   

    ret = doSomeThing(); 必须抛出异常,且不能处理异常,
    如果doSomeThing中已经catch了,显然就不会外面不能catch到异常了,就是不会到1啦。
      

  12.   

    > ret = doSomeThing(); //执行可能抛出异常的操作楼主虽然在这行上标注了“可能抛出异常”,但我感觉,你描述的现象都是“事实上没有抛出异常”时的情况。doSomeThing() 返回值为 null 并不是异常。
      

  13.   

    String f()
    {
        String ret = null;
        try {
             ret = doSomeThing(); //执行可能抛出异常的操作
        }catch (Exception e)
        {
            return null;  //1
         }
         return ret;  //2
    }
    1>为什么捕捉到异常后不直接在1处返回呢?我发现它是从2处返回的。2>我把2处的返回写在try块中就没有问题。3>为什么我不使用e对象,也必需声明一个变量名么?不可以像C++中样catch (Exception)么?捕捉异常后,如果真的出现异常(一种是你在前面抛出了异常,一种是你的代码确实有异常),才会执行catch里的代码,通常都是跳出,执行try 和catch外的代码。这些你可以自己试试。
    catch 中即使不使用e对象也要声明一个变量名,这是格式,硬性规定,就好象int 后也必须加东西一样,只有int是不符合语法的!!!
      

  14.   

    你的程序按照运行是不会出问题的,那是因为你在catch了以后,作了return。
    但是编译程序应该是不通过的,因为没有规定一定要在catch里面return。
    如果在catch里面没有return,那么catch运行完后就会运行最后面的东西,也就是ret.toString();所以会报错说你没初始化。
      

  15.   

    private string f()
    {
    String ret = null;
    try 
    {
    ret =ret.ToString(); //执行可能抛出异常的操作
    }
    catch (Exception e)
    {
    return null;  //1
    }
    return  ret.ToString();//2
    }
    在"//执行可能抛出异常的操作"的ret.ToString();肯定会抛出异常,但是它不会执行到2处
      

  16.   

    方法返回有两种, 一种是return, 一种是发生未处理的exception(或throw 不处理的exception). 如果return的话, 那么上一层程序就会正常运行; 如果是后者发生未处理exception, 那么上一层就会收到exception