我们知道捕捉异常非常昂贵.但是,即使从未抛出异常,在Java中使用try-catch块是否也很昂贵?
我找到了堆栈溢出问题/答案100,但它是针对.NET的.
我们知道捕捉异常非常昂贵.但是,即使从未抛出异常,在Java中使用try-catch块是否也很昂贵?
我找到了堆栈溢出问题/答案100,但它是针对.NET的.
try
美元几乎没有任何费用.代码的元数据不是在运行时设置try
,而是在编译时进行 struct 化,这样当抛出异常时,它现在会执行一个相对昂贵的操作,即遍历堆栈,查看是否存在任何try
个块来捕获该异常.从门外汉的Angular 来看,try
美元也可能是免费的.它实际上是抛出让你付出代价的异常——但除非你抛出数百或数千个异常,否则你仍然不会注意到代价.
try
有一些与之相关的小成本.JAVA不能对try
个挡路中的代码进行一些原本会做的优化.例如,Java通常会重新安排方法中的指令,以使其运行得更快-但Java还需要保证,如果抛出异常,则会观察到该方法的执行,就好像其源代码中编写的语句一直按顺序执行到某一行一样.
因为在try
块中可以抛出一个异常(在try块的任何一行!一些异常是异步抛出的,例如通过在线程上调用stop
(已弃用),甚至除此之外,OutOfMemoryError几乎可以在任何地方发生),但它可以被捕获,代码随后继续以相同的方法执行,更难对可以进行的优化进行推理,因此它们不太可能发生.(需要有人对编译器进行编程来完成这些操作,推理并保证正确性,等等.对于一些"例外"的东西来说,这将是一个巨大的痛苦),但在实践中,你不会注意到这样的事情.