什么是异常错误,我该如何解决?

时间:2019-02-21 20:01:38

标签: java exception exception-handling compiler-errors

我对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 :(得分:2)

您正在使用什么IDE?您应该能够轻松解决此错误,而无需任何外部帮助。在IntelliJ上,按Alt + Enter将使您可以选择将加密方法调用包含在try / catch块中,例如:

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

该方法引发异常,这基本上意味着它可能会遇到错误,而try catch块是一种处理该错误而不会导致程序崩溃的方法。

加密方法位于MD5Digest类内部的底部。看第一行:

public static void encrypt(String original) throws Exception

它告诉编译器它可能会遇到Exception(错误),并且您应该准备应对这种可能性。因此,需要try / catch。它将尝试尝试括号中的内容,然后如果遇到错误,将执行catch块中的代码。

答案 1 :(得分:1)

将主要方法更改为此: public static void main(String []args) throws Exception {
由于您是通过encrypt方法调用main方法的,因此您还需要将throws Exception添加到main方法中。希望这会有所帮助!

答案 2 :(得分:1)

基本上,您只需要给方法加一个标记,说明可能的异常,在这种情况下称为检查异常。因此,您使用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的签名,也可以使用@ K.Kretz说的throws Exception,这是关于异常层次结构的信息,您也可以在这里查看图片:

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