Что такое ошибка исключения и как ее исправить? - PullRequest
0 голосов
/ 21 февраля 2019

Я новичок в Java и мне нужна ваша помощь.Мой инструктор дал мне класс MD5Digest, и когда я запускаю файл сам, он без проблем компилируется.Но когда я копирую и вставляю класс в свой файл, он не работает.Может кто-нибудь, пожалуйста, помогите мне?Я читал, что это как-то связано с циклом try catch, но я не уверен, как настроить его для этого конкретного класса, потому что он мне дан, и я не знаю, что значит половина из этого.Заранее спасибо!

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.security.MessageDigest;

public class Login{
    public static void main(String []args){
        Scanner user_input = new Scanner(System.in);

        String entered_username = Get_Credentials.get_username(user_input);
        String entered_password = Get_Credentials.get_password(user_input);
        MD5Digest.encrypt(entered_password);
        user_input.close();
        User[] all_users = File_Scanner.create_users();
    }
}

class Get_Credentials{
    public static String get_username(Scanner user_input){
        System.out.println("Username: ");
        return user_input.next();
    }

    public static String get_password(Scanner user_input){
        System.out.println("Password: ");
        return user_input.next();
    }

}

class File_Scanner{
    public static User[] create_users(){
        User users[] = new User[6];
        int index_counter = 0;

        try {
            File credentials_file = new File("credentials.txt");
            String pattern = "[^\"\\s]+|\"(\\\\.|[^\\\\\"])*\"";
            Scanner file_reader = new Scanner(credentials_file);

            while (file_reader.hasNextLine()) {
                users[index_counter] = new User();
                users[index_counter].username = file_reader.findInLine(pattern);
                users[index_counter].encrypted_password = file_reader.findInLine(pattern);
                users[index_counter].password = file_reader.findInLine(pattern);
                users[index_counter].role = file_reader.findInLine(pattern);
                file_reader.nextLine();
                index_counter++;
            }

            file_reader.close();
        }
        catch (Exception e) {
          System.out.println(e.getClass());
        }
        return users;
    }
}

class User {
    String username;
    String password;
    String encrypted_password;
    String role;
}

class MD5Digest {
    public static void encrypt(String original) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(original.getBytes());
        byte[] digest = md.digest();
        StringBuffer sb = new StringBuffer();
        for (byte b : digest) {
            sb.append(String.format("%02x", b & 0xff));
        }

        System.out.println("original:" + original);
        System.out.println("digested:" + sb.toString());
    }

}

выдана ошибка:

Login.java:12: error: unreported exception Exception; must be caught or declared to be thrown
        MD5Digest.encrypt(entered_password);
                         ^
1 error

Ответы [ 3 ]

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

Измените ваш основной метод следующим образом: public static void main(String []args) throws Exception {.
Поскольку вы вызываете метод encrypt через метод main, вам также необходимо добавить throws Exception в метод main какЧто ж.Надеюсь, это поможет!

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

По сути, вам просто нужно дать знак вашему методу о возможных исключениях, которые в данном случае называются проверенными исключениями.Таким образом, вы используете MessageDigest абстрактный класс, а метод, к которому вы обращаетесь getInstance, имеет сигнатуру throws NoSuchAlgorithmException.Как сказал @Dymas, IDE может помочь увидеть его более четко.

Так как метод encrypt использует метод getInstance, вы должны сообщить encript об этом проверенном исключении.Также, поскольку main вызывает encript, что приводит к исключению из getInstance, вы также должны сообщить об этом main.Что заставляет вас поставить:

public static void main(String []args) throws NoSuchAlgorithmException
public static void encrypt(String original) throws NoSuchAlgorithmException

Эта страница также объясняет это довольно хорошо, это может быть полезно для дальнейшего чтения:

https://www.geeksforgeeks.org/checked-vs-unchecked-exceptions-in-java/

Вы можете использовать подписьthrows NoSuchAlgorithmException или, как говорит @KKretz throws Exception, речь идет об иерархии исключений, которую вы также можете посмотреть здесь с изображением:

https://itblackbelt.wordpress.com/2015/02/17/checked-vs-unchecked-exception-in-java-example/

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

Какой IDE вы пользуетесь?Вы должны быть в состоянии легко решить эту ошибку, не нуждаясь в посторонней помощи.На IntelliJ нажатие Alt + Enter даст вам возможность заключить вызов метода encrypt в блок try / catch, например:

    try {
        MD5Digest.encrypt(entered_password);
    } catch (Exception e) {
        e.printStackTrace();
    }

Метод выдает исключение, что в основном означает, что он может столкнуться сerror и блок try catch - это способ справиться с этой ошибкой без сбоя вашей программы.

Метод шифрования находится внизу, внутри класса MD5Digest.Глядя на первую строку:

public static void encrypt(String original) throws Exception

Он говорит компилятору, что он может столкнуться с исключением (ошибкой), и что вы должны быть готовы к такой возможности.Следовательно, требуется try / catch.Он будет пытаться определить, что находится в квадратных скобках, а затем, если возникнет ошибка, будет выполнен код в блоке catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...