函数或方法什么时候会停止执行?
这个函数在Objective-C中返回什么?函数或方法什么时候会停止执行?
- (NSInteger)test1 {
@try {
return 1;
} @catch (NSException *exception) {
return 2;
} @finally {
return 3;
}
return 4;
}
而当将一个函数或方法停止执行?(不仅是Objective-C代码)
------------更新----- ---------
结果是3
如果我评论或删除返回代码在最后,会出现什么功能输出?
- (NSInteger)test2 {
@try {
return 1;
} @catch (NSException *exception) {
return 2;
} @finally {
//return 3;
}
return 4;
}
结果为1
我问这个问题是要知道什么时候会在功能停止执行。
它,当它到达的代码路径的最后一行,所以它的理解代码路径中的所有问题停止执行。
一般规则:
- 代码在其出现的顺序执行。
- 在函数返回给调用者之前,finally代码块中的代码将运行。
- 要执行的最后一个返回语句的值将是函数的返回值。
现在,让我们将这些规则应用于您的示例。
- (NSInteger)test1 {
@try {
return 1;
} @catch (NSException *exception) {
return 2;
} @finally {
return 3;
}
return 4;
}
要执行的第一条语句是return 1;
。它在@try
块中实际上是不相关的,因为它不会引发异常。因为它是一个返回语句,函数即将返回。但是,有一个@finally
块,以便下一步执行。唯一的语句是return 3;
,以便执行并替换由前面的语句设置的函数的返回值。
如果从@finally
块删除代码,或完全消除块,代码执行的第一条语句后只是简单地返回,因为它是一个return
声明。
return
语句总是使函数的执行短路,并导致执行任何清理代码(例如,在ObjC中为@finally
块,在Swift中为defer
块)。
谢谢,你说得更清楚。 – Simon
我想你的code.I叫你在viewDidLoad方法
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSInteger i = [self test];
NSLog(@"The value is - %ld",(long)i);
}
- (NSInteger)test {
@try
{
return 1;
} @catch (NSException *exception) {
return 2;
} @finally {
return 3;
}
return 4;
}
编码并印刷
The value is - 3
其实首先它会调用try块,然后调用finally块。
@try - 定义的代码块是一个异常处理域: 代码,可以潜在地抛出异常。
@catch() - 定义一个包含用于处理抛出在@try块中的异常 的代码的块。 @catch的参数是本地抛出的异常 对象;这通常是一个NSException对象,但可以是其他类型的对象,例如NSString对象。
@finally - 定义一个相关代码块,随后执行 是否抛出异常。 finally块包含无论是否抛出异常都必须执行的代码。
@throw - 引发异常;此指令在 行为与NSException的raise方法几乎完全相同。您通常会抛出 NSException对象,但不限于它们。有关@throw的更多信息 ,请参见抛出异常。
但是,你甚至不会告诉我们它写了什么语言(看起来像Objective-C?) – tambre
是的,它是Objective-C。但在java中结果相同。 – Simon
我不明白这个问题。您可以编译并运行该代码(使用合适的样板)并亲自查看。 – Avi