依稀还记得,try{}之后的代码块应尽量越少越好,难道代码被try{}catch(){}包围之后会降低运行效率吗?
测试一下:
package exception; public class TestTry_Catch { public static boolean try_catch() { try { return true; } catch (Exception e) { return false; } } public static boolean no_try_catch() { return true; } public static void main(String[] args) { long current1 = System.currentTimeMillis(); long time = 10000000000l; for (long i = 0l; i < time; i++) try_catch(); long current2 = System.currentTimeMillis(); for (long j = 0l; j < time; j++) no_try_catch(); long current3 = System.currentTimeMillis(); System.out.println("try_catch time : " + (current2 - current1) + " ms"); System.out.println("no_try_catch time : " + (current3 - current2) + " ms"); } }
下面是console输出:
try_catch time : 4843 ms no_try_catch time : 4683 ms
这么多次,相差依然很小,在不会发生异常的情况下try_catch方法和no_try_catch方法运行的时间基本相差无几,在即时编译时try_catch方法比no_try_catch方法应花费稍多时间
下面再看一个更有趣的,当把return type改为void 时,代码:
package exception; public class TestTry_Catch { public static void try_catch() { try { // return true; } catch (Exception e) { // return false; } } public static void no_try_catch() { // return true; } public static void main(String[] args) { long current1 = System.currentTimeMillis(); long time = 10000000000l; for (long i = 0l; i < time; i++) try_catch(); long current2 = System.currentTimeMillis(); for (long j = 0l; j < time; j++) no_try_catch(); long current3 = System.currentTimeMillis(); System.out.println("try_catch time : " + (current2 - current1) + " ms"); System.out.println("no_try_catch time : " + (current3 - current2) + " ms"); } }
console 输出:
try_catch time : 4772 ms no_try_catch time : 4918 ms
try_catch 比no_try_catch花费的时间更少了,这该怎样解释呢?
让方法进行一些计算吧,不去创建对象,因为可能会触发GC,只是去计算一下1+1
package exception; public class TestTry_Catch { public static void try_catch() { try { int a = 1 + 1; int b = a + 3; } catch (Exception e) { // return false; } } public static void no_try_catch() { int a = 1 + 1; int b = a + 3; } public static void main(String[] args) { long current1 = System.currentTimeMillis(); long time = 10000000000l; for (long i = 0l; i < time; i++) try_catch(); long current2 = System.currentTimeMillis(); for (long j = 0l; j < time; j++) no_try_catch(); long current3 = System.currentTimeMillis(); System.out.println("try_catch time : " + (current2 - current1) + " ms"); System.out.println("no_try_catch time : " + (current3 - current2) + " ms"); } }
console输出:
try_catch time : 4957 ms no_try_catch time : 4934 ms
我开始怀疑 try{}catch(){}代码块越短越好 这句话的正确性了
下面测一下异常对象产的的耗时和普通对象产生的耗时比较:
package exception; import exception.entity.My_Exception; public class New_Object_Exception { public static void main(String[] args) { for (int i = 0; i < 10000; i++) new Throwable(); long number = 100000l; long current1 = System.currentTimeMillis(); for (long j = 0l; j < number; j++) new My_Exception(); long current2 = System.currentTimeMillis(); for (long i = 0l; i < number; i++) new Exception(); long current3 = System.currentTimeMillis(); System.out.println("new My_Exception time : " + (current2 - current1) + " ms"); System.out.println("new Exception time : " + (current3 - current2) + " ms"); } }
console输出:
new My_Exception time : 113 ms new Exception time : 144 ms
相差很小,一个数量级,无视GC了
下面测一下抛出异常到接收到异常的时间,代码如下:
package exception; import exception.entity.My_Exception; public class Catch_Exception { public static void main(String[] args) { long time = 100000l; for (int i = 0; i < 10000; i++) { new Throwable(); } long current1 = System.currentTimeMillis(); for (long i = 0l; i < time; i++) { try { throw new Exception(); } catch (Exception e) { } } long current2 = System.currentTimeMillis(); for (long i = 0l; i < time; i++) { try { throw new My_Exception(); } catch (My_Exception e) { } } long current3 = System.currentTimeMillis(); System.out.println("catch Exception : " + (current2 - current1) + " ms"); System.out.println("catch My_Exception : " + (current3 - current2) + " ms"); } }
console输出:
catch Exception : 77 ms catch My_Exception : 64 ms
贴一下jdk中Throwable 类的getMessage(), getStackTrace()源码
getMessage():
public String getMessage() { return detailMessage; }
detailMessage只是Throwable类的一个私有变量
private String detailMessage;
getStackTrace():
public StackTraceElement[] getStackTrace() { return getOurStackTrace().clone(); }
getOurStackTrace():
private synchronized StackTraceElement[] getOurStackTrace() { // Initialize stack trace field with information from // backtrace if this is the first call to this method if (stackTrace == UNASSIGNED_STACK || (stackTrace == null && backtrace != null) /* Out of protocol state */) { int depth = getStackTraceDepth(); stackTrace = new StackTraceElement[depth]; for (int i=0; i < depth; i++) stackTrace[i] = getStackTraceElement(i); } else if (stackTrace == null) { return UNASSIGNED_STACK; } return stackTrace; }
如果不是自定义的异常对象,大概没必要去调这个方法,如果不调这个方法抛出异常,捕获异常,貌似对性能也没什么影响
关于异常,各有各的想法吧
另外我的电脑配置:i5 win7 64位 4G内存, jdk : jdk1.7.0_10 b18 64位
相关推荐
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...
### Java Exception 几种不适当的处理 在Java编程中,异常处理是确保代码健壮性和稳定性的关键环节。然而,在实际开发过程中,由于对异常处理的理解不足或是编码习惯的不当,常常会出现一些不适当的异常处理方式,...
### 解决Java_heap_space问题:深入理解与策略 在Java应用程序开发与运行过程中,经常会遇到一个常见的内存管理问题——“Java heap space”。这个问题通常表现为Java虚拟机(JVM)在执行过程中因可用堆内存不足而...
但是,不恰当的异常处理可能会导致性能问题。文档中的“ExceptionJVMExceptiontry-catchthrow”暗示着这一部分的讨论。 10. 集合操作:在Java中,集合的操作,如数组拷贝(System.arraycopy())以及Apache Commons ...
Java 编程中常见的十种异常类型——包括 NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException, IOException, ClassNotFoundException, FileNotFoundException, SQLException, ...
本篇文章将探讨"exception 需要解决的问题",并结合提供的标签"源码"和"工具"进行深入分析。 在Java编程语言中,异常处理机制通过try-catch-finally语句块实现。当一个异常在try块中发生时,控制权会立即传递给相应...
1. **异常处理**:Java异常处理是编程中必不可少的部分,涉及try-catch-finally语句块,异常类层次结构(如Exception和Error),以及如何正确抛出和捕获异常。 2. **多线程**:Java提供了丰富的API来支持多线程编程...
在Java项目开发过程中,开发者经常会遇到一系列的问题,这些问题可能涉及到编程语法、运行环境、框架应用、性能优化等多个方面。以下是一些Java项目开发中的常见问题及其解决方案,旨在帮助开发者提高工作效率,减少...
在实际应用中,OPC客户端可能会与其他系统集成,例如SCADA(Supervisory Control and Data Acquisition)系统或者MES(Manufacturing Execution System),这时需要处理异步数据更新、错误恢复和性能优化等问题。...
Java中的异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。 - **实践案例**:在编写网络编程或文件操作相关的代码时,经常需要处理IOException等受检异常。你可以在方法签名中声明...
Java虚拟机(JVM)是Java应用程序的运行环境,它负责执行字节码并管理内存...通过上述方法,可以有效地预防和解决`java.lang.OutOfMemoryError: Java heap space`问题,优化JVM内存管理,提升应用程序的稳定性和性能。
在Java开发过程中,开发者经常会遇到各种各样的问题,这些问题涵盖了语法错误、运行时异常、性能优化、并发编程、内存管理等多个方面。以下是一些常见的Java开发问题及其解决方案: 1. **内存溢出(Out of Memory)...
5. **性能优化**:考虑使用缓存策略,减少不必要的请求;如果接口调用频繁,可能需要考虑异步调用或者批量处理,以提高效率。 6. **日志记录**:为了便于后期的问题排查,应记录每次接口调用的详细信息,包括请求...
5. **统计与监控**:内置了全面的统计和监控机制,包括调用次数、耗时、错误率等关键指标,便于进行问题定位和性能优化。 6. **线程安全**:设计上充分考虑了多线程环境下的安全性,确保了在并发场景下的正确性和...
在Java开发中,JSON(JavaScript ...以上就是关于Java中Fastjson、Jackson、Gson和json-lib这四个JSON工具的用法及性能测试的基本介绍。理解它们的特性可以帮助开发者更有效地处理JSON数据,提高项目的效率和质量。
通过Java代码技巧改善性能 在本篇文章中,我们将分享一些Java代码技巧,以提高程序性能。这些技巧虽然看起来微不足道,但是可以为系统性能带来成倍的提升。 首先,让我们来讨论try-catch语句的使用。在Java开发中...
跨语言调用涉及到安全性问题,确保传递的数据是安全的,避免注入攻击。同时,对于敏感操作,应确保Java和Delphi之间的权限控制。 10. **示例代码** 在Delphi 11中,可以这样编写调用Java接口的代码: ```delphi ...
理解如何合理分配和释放内存是避免性能问题的关键。 3. **类与对象**: - **封装**:Java通过访问修饰符(public, private, protected)实现数据封装,防止非法访问。 - **继承**:Java支持单继承,一个类可以...
本文介绍了一个基于Java的高性能长连接RPC解决方案,旨在解决大型电子商务公司系统的承载能力和灵活性问题。该解决方案是基于Netty实现的RPC框架,提供了易于使用和高度可扩展能力的特点。 首先,HSF框架是一个高...
然而,这并不是长久之计,因为增加内存可能会导致其他问题,如垃圾收集性能下降。 4. **减少对象创建**:在处理Excel数据时,避免创建过多的对象。重复使用对象或者使用高效的数据结构,如ArrayList而非LinkedList...