问题:Java中的exception处理实际上很慢吗? 传统的观点以及大量的Google结果都表明,特殊的逻辑不应该用于Java中的正常程序stream程。 通常有两个原因, 它真的很慢 – 甚至比普通代码慢一个数量级(所给出的原因各不相同), 和 它杂乱无章,因为人们只希望在特殊代码中处理错误。 这个问题是关于#1。 作为一个例子, 这个页面将Javaexception处理描述为“非常慢”,并将慢速与创buildexception消息string联系起来 – “这个string被用于创build抛出的exception对象,这不是很快。 Java中的有效exception处理( The Effective Exception Handling)在Java中表示,“其原因是由于exception处理的对象创build方面的原因,从而导致exception抛出exception缓慢”。 另一个原因是堆栈跟踪的生成是减慢速度。 我的testing(在32位Linux上使用Java 1.6.0_07,Java HotSpot 10.0)表明exception处理不会比普通代码慢。 我试着在执行一些代码的循环中运行一个方法。 在该方法的最后,我使用一个布尔值来指示是返回还是抛出 。 这样的实际处理是一样的。 我试着以不同的顺序运行这些方法,并平均testing时间,认为这可能是JVM热身。 在我所有的testing中,投掷的速度至less与回归速度一样快,如果不快的话(速度快3.1%)。 我对我的testing是错误的可能性完全保持开放,但是在代码示例,testing比较或上一两年的结果中,我没有看到任何东西,它们显示Java中的exception处理实际上是慢的。 导致我走这条路的是我需要使用的API,它将exception作为正常控制逻辑的一部分。 我想纠正他们的用法,但现在我可能无法。 相反,我会不得不赞扬他们的前瞻性思维? 在“ 即时编译中的高效的Javaexception处理”一文中 ,作者提出,即使没有抛出任何exception,单独存在exception处理程序也足以防止JIT编译器正确优化代码,从而降低其速度。 我还没有testing过这个理论。
我怎样才能使用JUnit4惯用testing一些代码抛出exception? 虽然我当然可以做这样的事情: @Test public void testFooThrowsIndexOutOfBoundsException() { boolean thrown = false; try { foo.doStuff(); } catch (IndexOutOfBoundsException e) { thrown = true; } assertTrue(thrown); } 我记得有一个注释或一个Assert.xyz或者一个远远不够灵活的东西 ,在这种情况下,JUnit的精神要远不止于此。
大多数人说永远不会从析构函数中抛出exception – 这样做会导致未定义的行为。 Stroustrup指出: “vector析构函数明确地调用每个元素的析构函数,这意味着如果析构函数抛出,vector销毁失败……真的没有好办法来防止析构函数抛出的exception,所以库如果元素析构函数抛出不作任何保证“(来自附录E3.2) 。 这篇文章似乎是另有说法 – 抛出析构函数或多或less是可以的。 所以我的问题是这样的 – 如果从析构函数中抛出导致未定义的行为,如何处理在析构函数中发生的错误? 如果在清理操作中发生错误,您是否忽略它? 如果这是一个错误,可能会被处理堆栈,但不是正确的析构函数,是不是有意义抛出exception析构函数? 显然这些错误是罕见的,但可能的。
我经常在其他堆栈溢出问题上看到关于如何使用except: pass的build议。 为什么这不好? 有时我只是不在乎错误是什么,我只想继续执行代码。 try: something except: pass 为什么使用except: pass块坏? 是什么让它变坏? 这是事实,我pass一个错误,或者我except任何错误?
我有我的应用程序不期望的每个条件创build的例外。 UserNameNotValidException , PasswordNotCorrectException等 不过,有人告诉我,我不应该为这些情况创build例外。 在我的UML中,主stream是exception的,为什么它不是一个例外呢? 任何创build例外的指导或最佳实践?
我使用Executor来玩SwingWorker的multithreading,而且我从那里错误的发现了Vector中的错误元素,看起来像这段代码很可能忽略了Vector中不存在的元素 我的问题 – >如何/有可能以某种方式捕捉这个exception 简单的输出 run: Thread Status with Name :StartShedule, SwingWorker Status is STARTED Thread Status with Name :StartShedule, SwingWorker Status is DONE Thread Status with Name :StartShedule, SwingWorker Status is STARTED Thread Status with Name :StartShedule, SwingWorker Status is DONE Thread Status with Name :StartShedule, SwingWorker Status is STARTED Thread Status with Name […]
Ryan Davis的Ruby QuickRef说(没有解释): 不要拯救例外。 EVER。 否则我会刺伤你。 为什么不? 什么是正确的事情?
我试图破译与应用程序遇到exception时写入事件日志的clr20r3相关联的P1 … P10参数的含义。 我能find的最好的是: P1 :主机进程( 例如 w3wp.exe ) P2 :主机进程版本( 例如 6.0.3790.1830 ) P3 :??? ( 例如 42435be1 ) P4 :引发exception的程序集( 例如 mrtables.webservice ) P5 :程序集版本( 例如 2.1.2.0 ) P6 : ( 例如 4682617f ) P7 : ( 例如 129 ) P8 : ( 例如 50 ) P9 :引发的exceptiontypes( 例如 system.argumentexception ) P10 : […]
我正在研究下面的java.lang.VerifyError java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature: (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageRe˜̴MtÌ´MÚw€mçw€mp:”MŒŒ at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357) at java.lang.Class.getConstructor0(Class.java:2671) 它发生在部署servlet的jboss服务器启动时。 它是用jdk-1.5.0_11编译的,我试着用jdk-1.5.0_15没有成功的重新编译它。 这是编译运行良好,但部署时,发生java.lang.VerifyError。 当我改变方法名称,并得到以下错误: java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: (IILjava/util/Collection;Lj ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageResources┬á├ÿ├àN|├ÿ├àN├Üw┬Çm├ºw┬ÇmX#├ûM|X├öM at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357 at java.lang.Class.getConstructor0(Class.java:2671) at java.lang.Class.newInstance0(Class.java:321) at java.lang.Class.newInstance(Class.java:303) 你可以看到更多的方法签名显示。 实际的方法签名是 private PgasePdfTable getMonthData(int month, int year, Collection dayTypes, Collection calendarDays, HashMap bcSpecialDays, Collection activityPeriods, Locale […]
我已经在Oracle的Java教程中尝试了这个例子。 他们都编译好,但在运行时,都提出了这个错误: Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square at Main.main(Main.java:7) Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) … 1 more 我想我可能有错误的文件夹中的Main.java文件。 这是目录层次结构: graphics ├ Main.java ├ shapes | ├ Square.java | ├ Triangle.java ├ linepoint | ├ Line.java | ├ Point.java ├ spaceobjects […]