0

単純なメール オブジェクトをシリアル化して保存したいのですが、常にエラーが発生し、その場所がわかりません。

package sotring;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

import com.sun.org.apache.bcel.internal.generic.INEG;

public class storeing {

    public static void storeMail(Message[] mail){
        try {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("mail.ser"));
            out.writeObject(mail);
            out.flush();
            out.close();

        } catch (IOException e) {
        }   
    }

        public static Message[] getStoredMails(){

     try
     {

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("mail.ser"));
        Message[] array = (Message[]) in.readObject() ;
        for (int i=0; i< array.length;i++)
            System.out.println("EMail von:"+ array[i].getSender() + " an " + array[i].getReceiver()+ " Emailbetreff: "+ array[i].getBetreff() + " Inhalt: " + array[i].getContent());

        System.out.println("Size: "+array.length);  //return array;
        in.close();
        return array;    
     }
     catch(IOException ex)
     {
        ex.printStackTrace();
        return null;
     }
     catch(ClassNotFoundException ex)
     {
        ex.printStackTrace();
        return null;
     }  
}

    public static void main(String[] args) {
        User user1 = new User("User1", "geheim");
        User user2 = new User("User2", "geheim");

        Message email1 = new Message(user1.getName(), user2.getName(), "Test", "Fooobaaaar");
        Message email2 = new Message(user1.getName(), user2.getName(), "Test2", "Woohoo");
        Message email3 = new Message(user1.getName(), user2.getName(), "Test3", "Okay =) ");
        Message [] mails = {email1, email2, email3};
        storeMail(mails);
        Message[] restored = getStoredMails();;         
    }
}

ユーザーとメッセージクラスは次のとおりです

public class Message implements Serializable{

    static final long serialVersionUID = -1L;

    private String receiver;  //Empfänger
    private String sender;  //Absender
    private String Betreff;
    private String content;
    private String timestamp;

    private String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        return dateFormat.format(date);
    }

    Message (String receiver, String sender, String Betreff, String content) {
        this.Betreff= Betreff;
        this.receiver = receiver;
        this.sender = sender;
        this.content = content;
        this.timestamp = getDateTime(); 
    }

    Message() {  // Just for loaded msg 
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }

    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    public String getBetreff() {
        return Betreff;
    }

    public void setBetreff(String betreff) {
        Betreff = betreff;
    }

    public String getContent() {
        return content;
    }
    public String getTime() {
        return timestamp;
    }
    public void setContent(String content) {
        this.content = content;
    }

}

public class User implements Serializable{

    static final long serialVersionUID = -1L;
    private String username;  //unique Username
    private String ipadress;  //changes everytime
    private String password;  //Password
    private int unreadMsg;    //Unread Messages
    private static int usercount;
    private boolean online;

    public String getName(){
        return username;
    }
    public boolean Status() {
        return online;
    }

    public void setOnline() {
        this.online = true;
    }
    public void setOffline() {
        this.online = false;
    }

    User(String username,String password){
        if (true){
            this.username = username;
            this.password = password;
            usercount++;

        } else System.out.print("Username not availiable"); 
    }

    public void changePassword(String newpassword){
        password = newpassword;
    }

    public void setIP(String newip){
        ipadress = newip;
    }

    public String getIP(){
        if (ipadress.length() >= 7){
            return ipadress;
        } else return "ip address not set.";
    }



    public int getUnreadMsg() {
        return unreadMsg;
    }   
}

例外は次のとおりです。

exception in thread "main" java.lang.Error: Unresolved compilation problem: This method must return a result of type Message[] at sotring.storeing.getStoredMails(storeing.java:22) at sotring.storeing.main(storeing.java:57)

ご協力ありがとうございました!!!!!!!!!!!

4

5 に答える 5

5

catch 句は何かを返す必要があります。

public static Message[] getStoredMails(){

     try
     {

            ObjectInputStream in = new ObjectInputStream(new FileInputStream("mail.ser"));
            Message[] array = (Message[]) in.readObject() ;
            System.out.println("Size: "+array.length);      //return array;
            in.close();
            return array;    
     }
     catch(IOException ex)
     {
            ex.printStackTrace();
     }
     catch(ClassNotFoundException ex)
     {
            ex.printStackTrace();
     }    
     return null; //fix  
}
于 2008-10-06T20:30:21.213 に答える
3

例外が発生した場合、getStoredMails の return ステートメントに到達することはありません。キャッチした例外をスローする (場合によっては、別のよりわかりやすい例外でラップする) か、メソッドの最後で単に null を返す必要があります。エラーが発生した場合に何をしたいかによって異なります。

ああ、あなたの in.close() は finally ブロックにあるはずです。そうしないと、データを正常に読み取ることができても、ストリームを閉じることができない場合はデータを破棄する可能性があります。

于 2008-10-06T20:29:21.777 に答える
2

別の話ですが、サードパーティのシリアライザー ライブラリを検討したことはありますか?

私は現在Simpleをプロジェクトに使用していますが、ほとんど労力をかけずに問題なく動作するようです。

于 2008-10-06T20:39:27.717 に答える
1

getStoredMails メソッドの例外処理ブロックでは、何も返されません。

推奨される修正:

public static Message[] getStoredMails(){

         try
         {

                ObjectInputStream in = new ObjectInputStream(new FileInputStream("mail.ser"));
                Message[] array = (Message[]) in.readObject() ;
                System.out.println("Size: "+array.length);      //return array;
                in.close();
                return array;    
         }
         catch(IOException ex)
         {
                ex.printStackTrace();
         }
         catch(ClassNotFoundException ex)
         {
                ex.printStackTrace();
         }  

         return null;    
    }
于 2008-10-06T20:56:07.730 に答える
0

ソースを修正しました。例外に「return null」を追加し、関数の出力に for ループを追加しました。関数は正しい出力を提供しますが、例外をスローします。

于 2008-10-06T20:35:08.957 に答える