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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黄玉昆 于 2013-2-22 08:01 编辑

我写了个测试,放在editplus里就可以运行,为什么放在eclipse里就有问题呢,就不能运行呢?
代码如下:
  1. //自定义异常,继承Exception
  2. class ZeroException extends Exception{
  3.         ZeroException(String mes){
  4.                 super(mes);
  5.         }
  6. }
  7. //测试:
  8. class Demo{
  9.         //定义一个功能,两数相除
  10.         int fun(int a,int b)throws ZeroException//声明异常
  11.         {
  12.                 //除数不能为零,否则抛出异常
  13.                 if (b==0)
  14.                         throw new ZeroException("出现零了");//除数为零,则抛出异常
  15.                 return a/b;
  16.         }
  17. }

  18. class TestException{        
  19.         public static void main(String [] args){
  20.                 Demo d = new Demo();
  21.                 //检测异常
  22.                 try {
  23.                         int x = d.fun(5, 0);
  24.                         System.out.println( "x=" + x);
  25.                 }
  26.                 //捕获异常,并给出解决方案
  27.                 catch (ZeroException e) {
  28.                         System.out.println(e.toString());
  29.                 }
  30.                 //一定会执行到的语句
  31.                 finally
  32.                 {
  33.                         System.out.println("OVER");
  34.                 }
  35.         }
  36. }
复制代码

1.png (7.45 KB, 下载次数: 41)

1.png

2.PNG (29.61 KB, 下载次数: 41)

2.PNG

3.PNG (15.51 KB, 下载次数: 34)

3.PNG

评分

参与人数 1黑马币 +9 收起 理由
李培根 + 9 赞一个!

查看全部评分

12 个回复

正序浏览
“如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议 所有可序列化类都显式声明 serialVersionUID 值,原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修饰符显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于直接声明类 -- serialVersionUID 字段作为继承成员没有用处。数组类不能声明一个明确的 serialVersionUID,因此它们总是具有默认的计算值,但是数组类没有匹配 serialVersionUID 值的要求。”
这个是API文档中的叙述。这是一个警告提示。如果你运行没有结果,看下你的java命令配置的主函数是不是你写的这个类中的主函数
回复 使用道具 举报
你说的是eclipse的警告,不是错误,是可以运行的,eclipse的警告说明你写的代码和eclipse的语法检查不是很兼容
回复 使用道具 举报
康乐 发表于 2013-2-20 19:16
可能是我解释的不太明白吧,Exception是实现了Serialzable接口的,实现了Serialzable接口的类,最好显式 ...

谢谢,我会尝试尝试的
回复 使用道具 举报
黄玉昆 发表于 2013-2-17 18:39
加了public还是一样的问题,还是我上面第三幅图的问题。

可能是我解释的不太明白吧,Exception是实现了Serialzable接口的,实现了Serialzable接口的类,最好显式声明serialVersionUID 属性,并给这个属性赋值,不写没没关系,Eclipse会给你提醒,告诉你,该写的你没写。如果想让这个警告消失,可以点左边出现的带叹号的小灯泡,编译器会给相应的解决方案。你点一下,自动给你的那个一serialVersionUID 属性。或者上边加一个代码忽略警告。
回复 使用道具 举报
黄玉昆 黑马帝 2013-2-17 18:39:15
9#
夏振博 发表于 2013-2-17 18:31
带警告的 是在编译期可以通过,在以后运行期可能会遇到问题 如果像你这段代码量少 等测试代码自己明白运行 ...

加了public还是一样的问题,还是我上面第三幅图的问题。
回复 使用道具 举报
带警告的 是在编译期可以通过,在以后运行期可能会遇到问题 如果像你这段代码量少 等测试代码自己明白运行时没有问题的 可以暂时忽略
加public 是对的,切只能加一个public 向主类修饰如果代码里有主方法main必须将这个类用public修饰,
回复 使用道具 举报
黄玉昆 黑马帝 2013-2-17 17:52:12
7#
康乐 发表于 2013-2-17 17:37
最好把带主函数的类用public修饰,在Eclipse中需要新建一个类,把代码全部拷贝过去,类名一定要和被public ...

一直使用editplus,对这个eclipse没研究呢,等学完视频再好好研究吧
回复 使用道具 举报
最好把带主函数的类用public修饰,在Eclipse中需要新建一个类,把代码全部拷贝过去,类名一定要和被public修饰的类名是一样。
在我的机器上,也会出现警告,大概意思是
序列化的类ZeroException没有定义常量serialVersionUID。因为Exception实现了Serializable接口,ZeroException继承了Exception。

警告的原因也就能知道个大概了,在API中有Serialzable的介绍,在最后又提到以下内容,
强烈建议 所有可序列化类都显式声明 serialVersionUID 值,原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,
根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。
回复 使用道具 举报
罗正荣 发表于 2013-2-17 12:17
以下答案纯属菜鸟瞎掰和猜测因为在我的机子上是这样 你可以试试看
Eclipse里好像主函数只能 ...

我试了,加上public会出问题。你发现没,你的每个名称前都有个叹号警告。我的就是这样的标志。不知道为啥
回复 使用道具 举报
夏振博 发表于 2013-2-17 12:26
在eclipse里你建包了吗?   如最上面:package cn.itheima;

我就是在包下运行的,运行是没问题了,但是只能通过右边的那个,右击才能运行,我不知道为什么会有警告。截图如题中。
回复 使用道具 举报
在eclipse里你建包了吗?   如最上面:package cn.itheima;
回复 使用道具 举报
以下答案纯属菜鸟瞎掰和猜测{:soso_e113:}因为在我的机子上是这样 你可以试试看
Eclipse里好像主函数只能在对应的类名下运行,而且该类的权限要加public
所以在类class TestException前加一个public 并且需要把当前Eclipse资源管理器中对应的类名改为TestException
这样就可以运行通过了

3.jpg (53.88 KB, 下载次数: 36)

3.jpg
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马