A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 林志花 于 2012-11-28 20:20 编辑

这是在做基础测试时,我为下题设计的思路,明显不对。但是程序写出来,在JCreator中编译通过,没有错误和警告,但是运行起来,出现不正常提示:
Exception in thread "main" java.lang.NoSuchMethodError:Main
换到eclipse中运行,程序结果是另外一个程序的结果,总之,没出现正常结果。。汗一个~~
写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。

我的算法老师说,最喜欢碰到这样的程序,语法正确,但是程序可能逻辑或者算法不正确。。。
好啦,烦请大鸟上场帮忙啦~
//return和finally的执行次序问题
class Re
{
static int x,y;
public static int devide(int x,int y)   //方法返回x/y的值
       {
       return x/y;
       }   
public static int main(String[] args)
{
  int result=0;                             //result赋初值0
  try{
   result=devide(3,0);                 //出现错误的地方,即使改成将(3,1),还是出现同样的编译、运行结果
   result++;
   System.out.println("this is in try");    //提示try执行
  }
  catch (ArithmeticException e)
        {
         System.out.println(" ArithmeticException catched! ");   //提示catch执行,捕捉到错误
        }
        finally
        {
         System.out.println("Finally!~");    //提示fianally执行了
         result+=10;         //改变result值
        }
        return result;        //返回result值(个人感觉认为是这里出现错误。。但是不知道怎么改啊~)
}
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
本帖最后由 王梁星 于 2012-11-28 11:14 编辑
  1. <div class="blockcode"><blockquote>class Re
  2. {
  3. static int x,y;
  4. public static int devide(int x,int y)   //方法返回x/y的值
  5.        {
  6.        return x/y;
  7.        }   
  8. public static void main(String[] args)//<font color="Red">main函数必须用void修饰</font>
  9. {
  10.   int result=0;                             //result赋初值0
  11.   try{
  12.    result=devide(3,0);                 //出现错误的地方,即使改成将(3,1),还是出现同样的编译、运行结果
  13.    result++;
  14.    System.out.println("this is in try");    //提示try执行
  15.   }
  16.   catch (ArithmeticException e)
  17.         {
  18.          System.out.println(" ArithmeticException catched! ");   //提示catch执行,捕捉到错误
  19.         }
  20.         finally
  21.         {
  22.          System.out.println("Finally!~");    //提示fianally执行了
  23.          result+=10;         //改变result值
  24.         }
  25.         System.out.println(result);        //<font color="Red">返回result值.对于void修饰的函数,返回值时,应用s.o.p语句</font>
  26. }
  27. }
复制代码
没搞错的话,main函数应由void修饰.参见红色部分

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
主函数格式不对,返回值类型void,所以要另写一个方法,然后用主函数来调用这个方法。
我感觉这个题应该是想考这个的

class Re
{
                static int x,y;
                public static int devide(int x,int y)   //方法返回x/y的值
       {
                        return x/y;
       }   
                public static int Text()
                {
                        int result=0;                             //result赋初值0
                        try
                        {
                                result=devide(3,1);               
                                result++;
                                System.out.println("this is in try");    //提示try执行
                            return result;        //返回result值
                        }
                        catch (ArithmeticException e)
                        {
                                System.out.println(" ArithmeticException catched! ");
                                return result;
                        }
                        finally
                        {
                                System.out.println("Finally!~");    //提示fianally执行了
                                result+=10; //改变result值
                               
                         }
                }
                public static void main(String[] args)
                {
                       
                        System.out.println(Text());
                }
}


评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
舒远 黑马帝 2012-11-28 11:21:18
板凳
从c转过来的吧?java主函数必须是void。
回复 使用道具 举报
主函数类型必须是void的返回值。return result;改成system.out.print(result);

修改.PNG (41.88 KB, 下载次数: 31)

修改.PNG

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
public static int main(String[] args)
在java中jvm只找main为程序的入口执行程序。一但main运行结束就代表你的程序结束,所以你不能再别的方法中调用main,main就不能有返回值,也就只能用void,同时也不能有return result,改成system.out.print(result)就好了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 林志花 于 2012-11-28 20:04 编辑

理解了。。。谢谢楼上各位,讲解得很详细{:soso_e100:}!
回复 使用道具 举报
舒远 发表于 2012-11-28 11:21
从c转过来的吧?java主函数必须是void。

不是从C转过来的,记得是找图书馆的书参考的,可能自己当时看着题目,无从下手,认为要有返回值,只好将void改成int有返回值。。。
可怜我印象中完全没有java的主函数必须是void的语法定义~~为自己汗一个!~~
回复 使用道具 举报
综上:
通过将主函数返回类型int改成void;
return result;改成system.out.println(result);
就OK了!多谢楼上各位指教!已经能够正常运行处结果。。。
回复 使用道具 举报
陈山 中级黑马 2012-11-29 22:11:27
10#
Exception in thread "main" java.lang.NoSuchMethodError:Main,出现这样的异常,很明显是jvm找不到main方法,因为你的代码中没有正确的写出main方法,建议改成这样:
class Re
{
static int x,y;
public static int devide(int x,int y)   //方法返回x/y的值
       {
       return x/y;
       }   
public static void main(String[] args)
{
        fun();
}

public static int fun(){
  int result=0;                             //result赋初值0
  try{
   result=devide(3,0);                 //出现错误的地方,即使改成将(3,1),还是出现同样的编译、运行结果
   result++;
   System.out.println("this is in try");    //提示try执行
  }
  catch (ArithmeticException e)
        {
         System.out.println(" ArithmeticException catched! ");   //提示catch执行,捕捉到错误
        }
        finally
        {
         System.out.println("Finally!~");    //提示fianally执行了
         result+=10;         //改变result值
        }
        return result;        //返回result值(个人感觉认为是这里出现错误。。但是不知道怎么改啊~)
}       
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
十分感谢楼上给予新的方法,原来出现这个错误提示是因为JVM找不到main方法。。。又学到一个技巧,真是人多力量大啊。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马