Class.forName为什么要throws或者try啊

ole_master 2016-12-20 07:49:20
不加编译通不过,是不是标准这样规定的,具体在什么地方啊
...全文
694 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ole_master 2016-12-22
  • 打赏
  • 举报
回复
引用 14 楼 windowsoahil 的回复:
[quote=引用 11 楼 ole_master 的回复:] [quote=引用 9 楼 windowsoahil 的回复:] 你通过一个字符串来创建一个class对象,因为编译器不能在编译时检查字符串对应的类是否存在,所以声明受检异常,提示:你必须自己处理这个类不存在的情况
直接返回null不就可以了啊,throw从来不用的,不知道java为什么要这样设计[/quote] 相反,在类似情况中返回null反而是公认的“代码的坏味道”,因为编译器给出更少的提示意味着出现更多的逻辑错误 代码少的时候你当然能一一顾及,但代码量很大的时候,反而需要依赖于编译器的机制来减少人工的思考量[/quote] 是不是java没有指针,不能返回错误信息只能异常,那也很奇怪,如果一个函数有很多种错误的可能,就要抛出很多种异常啊 还有就是用throws或者try,里面有多个Class.forName语句,怎么知道具体是哪个不对,是不是还要是判断null啊
ryuugu_rena 2016-12-22
  • 打赏
  • 举报
回复
抛异常很正常呀,因为已经预料到了可能会出现的异常,所以就提前抛出了
解开者 2016-12-22
  • 打赏
  • 举报
回复
引用 11 楼 ole_master 的回复:
[quote=引用 9 楼 windowsoahil 的回复:] 你通过一个字符串来创建一个class对象,因为编译器不能在编译时检查字符串对应的类是否存在,所以声明受检异常,提示:你必须自己处理这个类不存在的情况
直接返回null不就可以了啊,throw从来不用的,不知道java为什么要这样设计[/quote] 相反,在类似情况中返回null反而是公认的“代码的坏味道”,因为编译器给出更少的提示意味着出现更多的逻辑错误 代码少的时候你当然能一一顾及,但代码量很大的时候,反而需要依赖于编译器的机制来减少人工的思考量
ole_master 2016-12-22
  • 打赏
  • 举报
回复
引用 23 楼 windowsoahil 的回复:
[quote=引用 22 楼 ole_master 的回复:] [quote=引用 21 楼 windowsoahil 的回复:] 资料的话可以参考《核心技术》卷I,或者上网找找Java异常体系,应该不少 Java异常体系由来已久,我说不出太高深的,可以理解为Java为了降低对开发人员的技术要求(尤其相对于C系语言),在语言层次施加的强制约束。从结果来看,因为Java技术体系三方框架众多,每个框架都会定制自己的异常体系,其提供的信息和堆栈对调试有极大帮助(也是相对于C系语言)。这其实是更加符合人类语言习惯的表达方式,所以才说Java入门更容易。
我看的就这本,其他什么head first都没讲forName的,我再想想,照道理一个函数返回几十种错误信息很正常啊,全部都作为异常处理不太可能[/quote] 首先,Java异常机制是深入到JDK内部的,比如操作空对象会抛出NullPointerException,不合法强转会抛出ClassCastException等;其次,Java的异常类表义能力很强,除了类名本身可以表义之外,异常类都带有message和stackTrace,可以携带更多信息,而不仅仅是一个状态码[/quote] 感觉基本在抄seh啊,不过seh还要强,异常的语句可以修改下重新执行一遍
解开者 2016-12-22
  • 打赏
  • 举报
回复
引用 22 楼 ole_master 的回复:
[quote=引用 21 楼 windowsoahil 的回复:] 资料的话可以参考《核心技术》卷I,或者上网找找Java异常体系,应该不少 Java异常体系由来已久,我说不出太高深的,可以理解为Java为了降低对开发人员的技术要求(尤其相对于C系语言),在语言层次施加的强制约束。从结果来看,因为Java技术体系三方框架众多,每个框架都会定制自己的异常体系,其提供的信息和堆栈对调试有极大帮助(也是相对于C系语言)。这其实是更加符合人类语言习惯的表达方式,所以才说Java入门更容易。
我看的就这本,其他什么head first都没讲forName的,我再想想,照道理一个函数返回几十种错误信息很正常啊,全部都作为异常处理不太可能[/quote] 首先,Java异常机制是深入到JDK内部的,比如操作空对象会抛出NullPointerException,不合法强转会抛出ClassCastException等;其次,Java的异常类表义能力很强,除了类名本身可以表义之外,异常类都带有message和stackTrace,可以携带更多信息,而不仅仅是一个状态码
ole_master 2016-12-22
  • 打赏
  • 举报
回复
引用 21 楼 windowsoahil 的回复:
资料的话可以参考《核心技术》卷I,或者上网找找Java异常体系,应该不少 Java异常体系由来已久,我说不出太高深的,可以理解为Java为了降低对开发人员的技术要求(尤其相对于C系语言),在语言层次施加的强制约束。从结果来看,因为Java技术体系三方框架众多,每个框架都会定制自己的异常体系,其提供的信息和堆栈对调试有极大帮助(也是相对于C系语言)。这其实是更加符合人类语言习惯的表达方式,所以才说Java入门更容易。
我看的就这本,其他什么head first都没讲forName的,我再想想,照道理一个函数返回几十种错误信息很正常啊,全部都作为异常处理不太可能
解开者 2016-12-22
  • 打赏
  • 举报
回复
引用 19 楼 ole_master 的回复:
[quote=引用 18 楼 windowsoahil 的回复:] 准确来说,受检异常(即编译器强制处理的异常)标志着这个异常的场景无法在开发阶段避免;相反有非受检异常(编译器不强制处理),Java认为其一定可以通过合理规划代码结构来规避。 同一个方法声明多种异常是比较常见的,尤其在反射API中,例如Method类的invoke方法 在异常被抛出时,抛出的异常对象本身将带有现场信息,包括调用堆栈、异常信息等
不能理解,系统的库怎么还要强制用户来catch,几十种错误每个都throws啊,有没有什么书是讲这个的 正常应该是这样设计,int Class::forNameAndnewInstance([in] string str, [out] Object &obj),int返回错误信息,java为什么不这样做啊[/quote] 资料的话可以参考《核心技术》卷I,或者上网找找Java异常体系,应该不少 Java异常体系由来已久,我说不出太高深的,可以理解为Java为了降低对开发人员的技术要求(尤其相对于C系语言),在语言层次施加的强制约束。从结果来看,因为Java技术体系三方框架众多,每个框架都会定制自己的异常体系,其提供的信息和堆栈对调试有极大帮助(也是相对于C系语言)。这其实是更加符合人类语言习惯的表达方式,所以才说Java入门更容易。
ole_master 2016-12-22
  • 打赏
  • 举报
回复
上面写的不对,最后应该是Object **,我好像想理解java为什么要这样设计了,java应该是不支持**这种的,所以Object*只能是作为函数的返回值,那错误信息就只能在参数中,但又没有int*这种,所以用户得不到错误信息,只能通过异常来让用户获得错误信息,不知道是不是这样啊
ole_master 2016-12-22
  • 打赏
  • 举报
回复
引用 18 楼 windowsoahil 的回复:
准确来说,受检异常(即编译器强制处理的异常)标志着这个异常的场景无法在开发阶段避免;相反有非受检异常(编译器不强制处理),Java认为其一定可以通过合理规划代码结构来规避。 同一个方法声明多种异常是比较常见的,尤其在反射API中,例如Method类的invoke方法 在异常被抛出时,抛出的异常对象本身将带有现场信息,包括调用堆栈、异常信息等
不能理解,系统的库怎么还要强制用户来catch,几十种错误每个都throws啊,有没有什么书是讲这个的 正常应该是这样设计,int Class::forNameAndnewInstance([in] string str, [out] Object &obj),int返回错误信息,java为什么不这样做啊
解开者 2016-12-22
  • 打赏
  • 举报
回复
引用 16 楼 ole_master 的回复:
[quote=引用 14 楼 windowsoahil 的回复:] [quote=引用 11 楼 ole_master 的回复:] [quote=引用 9 楼 windowsoahil 的回复:] 你通过一个字符串来创建一个class对象,因为编译器不能在编译时检查字符串对应的类是否存在,所以声明受检异常,提示:你必须自己处理这个类不存在的情况
直接返回null不就可以了啊,throw从来不用的,不知道java为什么要这样设计[/quote] 相反,在类似情况中返回null反而是公认的“代码的坏味道”,因为编译器给出更少的提示意味着出现更多的逻辑错误 代码少的时候你当然能一一顾及,但代码量很大的时候,反而需要依赖于编译器的机制来减少人工的思考量[/quote] 是不是java没有指针,不能返回错误信息只能异常,那也很奇怪,如果一个函数有很多种错误的可能,就要抛出很多种异常啊 还有就是用throws或者try,里面有多个Class.forName语句,怎么知道具体是哪个不对,是不是还要是判断null啊[/quote] 准确来说,受检异常(即编译器强制处理的异常)标志着这个异常的场景无法在开发阶段避免;相反有非受检异常(编译器不强制处理),Java认为其一定可以通过合理规划代码结构来规避。 同一个方法声明多种异常是比较常见的,尤其在反射API中,例如Method类的invoke方法 在异常被抛出时,抛出的异常对象本身将带有现场信息,包括调用堆栈、异常信息等
  • 打赏
  • 举报
回复
存在预知的异常
yibangzhenqing 2016-12-21
  • 打赏
  • 举报
回复
7楼说的对,这是必须处理的异常,不是runtimeexception的子类
ole_master 2016-12-21
  • 打赏
  • 举报
回复
引用 9 楼 windowsoahil 的回复:
你通过一个字符串来创建一个class对象,因为编译器不能在编译时检查字符串对应的类是否存在,所以声明受检异常,提示:你必须自己处理这个类不存在的情况
直接返回null不就可以了啊,throw从来不用的,不知道java为什么要这样设计
ole_master 2016-12-21
  • 打赏
  • 举报
回复
引用 8 楼 qq_33276539 的回复:
可以看看forname的原型,他本来就抛出了一个必须要处理的异常。你现在调用这个方法,当然要对异常处理。
那原型为什么要这样设计啊,是不是标准中有规定,字符串中不是类的话直接返回null不就可以了
解开者 2016-12-21
  • 打赏
  • 举报
回复
你通过一个字符串来创建一个class对象,因为编译器不能在编译时检查字符串对应的类是否存在,所以声明受检异常,提示:你必须自己处理这个类不存在的情况
qq_33276539 2016-12-21
  • 打赏
  • 举报
回复
可以看看forname的原型,他本来就抛出了一个必须要处理的异常。你现在调用这个方法,当然要对异常处理。
qq_33276539 2016-12-21
  • 打赏
  • 举报
回复
这个是必须要处理的异常,是Exception的子类但不是RuntimeException的子类,所以不处理的话连编译都通不过。
ole_master 2016-12-20
  • 打赏
  • 举报
回复
引用 3 楼 m2200 的回复:
forName方法里的字符串参数,Java在未运行时是不知道到底存不存在这个类的,这是一种提醒,告诉你这里很可能会有class找不到的异常。 我们在自己写代码的时候也可以给自己的方法throws一个异常,别的方法在调用你的方法的时候也就需要throws或try-catch,你抛出的异常相当于告诉其它方法你这方法可能出现的异常。
什么书详细讲这个Class的啊
ole_master 2016-12-20
  • 打赏
  • 举报
回复
引用 2 楼 liny_ 的回复:
个人理解:这个方法你是调用的,而给你用这个方法的人并没有去解决这个异常,把这个异常抛给你了,所以你一定要解决这个异常,try和throws都是解决办法,但是你throws出去的话,调用了你这个连接的人还是要解决的,就是异常一定要解决
那怎么getClass或者class不用加啊
ole_master 2016-12-20
  • 打赏
  • 举报
回复
引用 1 楼 bichir 的回复:
forName("")是class的一个静态方法,该方法可以加载类。 但是该方法中调用的是forName0的一个本地主法,此方法会抛出一个ClassNotFoundException的一个异常,所以在forname时同时向外抛出该异常,他向外抛的目的是当找不到这个class时告诉我们这个class在当前环境中没有找到,让我们自己看着办,
 @CallerSensitive
    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }
不知道你们学异常处理没,所有throws都需要在调用方用try或者继续throws到上一层。
只会__try,c++的基本不用,什么书讲这个的,怎么翻了几本,都没提到
加载更多回复(3)

62,630

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧