1. ホーム
  2. java

[解決済み】Javaエラー:voidはStringに変換できない【重複あり

2022-02-17 20:10:16

質問

似たような投稿があるのは知っているのですが、私の問題が解らないようです。 私はそれが何か小さなもののように感じるが、私のメソッドはStringを返すので、私はそれが私にタイプ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 {

まで

public static String encrypt(String original) throws Exception {

return sb.toString()

だから、クラスは次のようになる。

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の命名規則には気をつけましょう。クラス名は主語にすること。

EDIT

暗号化メッセージは例外を投げるので、その例外を public static void main(String []args) throws Exception{ または、try-catch-blockで処理する必要があります。