Java错误:无法将void转换为字符串

Java错误:无法将void转换为字符串,java,compiler-errors,incompatibletypeerror,Java,Compiler Errors,Incompatibletypeerror,我知道有类似的帖子,但我似乎无法解决我的问题。我觉得它很小,但我的方法确实返回了一个字符串,所以我不知道为什么它告诉我键入void。我是java新手,希望能得到任何帮助。这是我的密码: import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.security.MessageDigest; public class Login{ public stat

我知道有类似的帖子,但我似乎无法解决我的问题。我觉得它很小,但我的方法确实返回了一个字符串,所以我不知道为什么它告诉我键入void。我是java新手,希望能得到任何帮助。这是我的密码:

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);
        String encrypted_password = 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:15: error: incompatible types: void cannot be converted to String
        encrypted_password = MD5Digest.encrypt(entered_password);
                                              ^
1 error

函数没有返回值void,您尝试将其分配给字符串变量,这就是错误消息的含义

因此,改变:

public static void encrypt(String original) throws Exception {

所以这个类看起来像:

class MD5Digest {
    public static String 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());
        return sb.toString();
    }

}
顺便说一句:注意Java的命名约定。类名应该是主题

编辑:


由于加密消息引发异常,因此您还必须在public static void mainString[]args throws exception{中引发异常,或者必须在try-catch块中处理异常。在代码中,您没有为MD5Digest类中的方法encrypt返回任何内容,如下所示:

public static void encrypt(String original) throws Exception
class MD5Digest {
public static String 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());
    return sb.toString();
}

}
这就是为什么编译器会给出错误,因为它是void类型,但代码是字符串

看起来您想要返回一个字符串,它应该如下所示:

public static void encrypt(String original) throws Exception
class MD5Digest {
public static String 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());
    return sb.toString();
}

}

看看您的MD5Digest类和encrypt方法。它是否返回字符串?该类位于底部。不,它只是打印原始密码和加密密码。不返回任何值。哇。我不敢相信我忘记了返回语句。谢谢!谢谢!我已更改代码以匹配您的,但现在我收到一个新错误:Login.java:12:错误:未报告的异常;必须被捕获或声明为抛出|字符串加密_password=MD5Digest.encryptentered _password;非常感谢!您是一个救生员!