Отсутствует инструкция возврата после реализации catch {throw ..} - PullRequest
0 голосов
/ 01 февраля 2019

В нем говорится о пропущенном операторе возврата, даже если он возвращает в блоке try.Я не понимаю.Я пытаюсь создать приложение для Android, а также сохранить учетные данные для входа в приложение с Android keystore.Также, если кто-нибудь может дать мне пример простой реализации keystore, это было бы здорово.Я нашел 2 примера, и они не очень понятны (отсутствуют коды), а также трудно применимы к моей ситуации.

private SecretKey createKey() {
    try {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            keyGenerator.init(new KeyGenParameterSpec.Builder("Key", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                    .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                    .setUserAuthenticationRequired(true)            //burayı kaldırırsan screen locka gerek kalmaz
                    .setUserAuthenticationValidityDurationSeconds(5)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                    .build());
            return keyGenerator.generateKey();
        }
    } catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
        throw new RuntimeException("Failed to create a symmetric key", e);
    }

}

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Вы должны иметь оператор return, который выполняется, если ваш оператор if не соответствует требованиям.Прямо сейчас вы возвращаете что-то только в том случае, если SDK больше, чем Build.VERSION_CODES.M.

Вы можете поместить оператор return после всей попытки и перехвата, потому что если вы вернетесь в попытке, он выйдет изметод.Это означает, что другой возврат выполняется только в том случае, если сборочный SDK не соответствует требованиям.

private SecretKey createKey() {
try {
    KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        keyGenerator.init(new KeyGenParameterSpec.Builder("Key", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                .setUserAuthenticationRequired(true)            //burayı kaldırırsan screen locka gerek kalmaz
                .setUserAuthenticationValidityDurationSeconds(5)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                .build());
        return keyGenerator.generateKey();
    }
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
    throw new RuntimeException("Failed to create a symmetric key", e);
}

// Return here...

}

0 голосов
/ 01 февраля 2019

добавить оператор возврата перед последней фигурной скобкой

0 голосов
/ 01 февраля 2019

Проблема в том, что у вас нет возврата, если ваше Build.VERSION.SDK_INT >= Build.VERSION_CODES.M условие не выполнено.

private SecretKey createKey() {
    try {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // ...
            return keyGenerator.generateKey();
        }
        // add a return here if we're not on >= Android M.
    } catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
        throw new RuntimeException("Failed to create a symmetric key", e);
    }
    // you could also have a return here.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...