4

私はこの方法を持っています:

+ (MHTwitterParser*)createParser:(NSString*)format {
    if ([format compare:@"json"] == NSOrderedSame) {
        return [[MHJsonTwitterParser alloc] init];
    }

    [NSException raise:@"Unknown format" format:@"Unknown format of parser"];
}

コンパイラは次のように文句を言います。

Control may reach end of non-void function

これは単なる警告ですが、問題ではありません。

そのための明らかな修正は、たとえばreturn nil;の後に追加すること[NSException raise: ...です。

ただし、例外がスローされるため、必要ない(そして読者にとって誤解を招く)と思います。したがって、「制御が非void関数の終わりに達する可能性がある」というのは真実ではありません。または私は何かが欠けていますか...?それはコンパイラの不完全さだけですか、それともこれにはかなりの理由がありますか?

コンパイラはAppleLLVMコンパイラ3.1です

4

3 に答える 3

11

で置き換える[exception raise];こと@throw exception;は機能的に同じことであり、警告を防ぎます(「例外のスロー」を参照)。

于 2012-05-01T17:51:13.363 に答える
8

理由は簡単です。

コンパイラーの場合、メソッド[NSException raise: ...]はブラックボックスメソッドです。メソッドが実際に例外を発生させるかどうかはわかりません。

JavaまたはC++と比較すると、それらのthrowステートメントは言語機能であり、コンパイラーはそれを見つけたときに何が起こるかを正確に認識しています。Obj-Cではそれは異なり、実行時の条件に依存することもあります。次のことを考慮してください。

NSException* exception = nil;

if (someCondition) {

   exception = [NSException exceptionWithName:...];
}

[exception raise];

コンパイラは、例外が実際に発生したかどうかを知りません。

于 2012-05-01T16:46:32.223 に答える
1

警告は、コード内のすべてのパスが、コンパイラーが潜在的に問題があると認識するreturnステートメントで終わるわけではないという理由だけで発生します。とは言うものの、おそらくここで例外をスローするべきではなく、代わりにを生成しNSErrorて返す必要がありnilます。Objective-cの例外とエラーの違いはここここで説明されています。

于 2012-05-01T16:46:22.947 に答える