Java:序列化初学者问题:-(

时间:2008-10-06 20:26:10

标签: java arrays serialization

我希望通过序列化来保存和存储简单的邮件对象,但我总是会遇到错误而我找不到它。

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)

感谢您的帮助!!!!!!!!!!!

5 个答案:

答案 0 :(得分: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  
}

答案 1 :(得分:3)

如果发生异常,您永远不会到达getStoredMails中的return语句。您需要抛出捕获的异常(可能将其包装在另一个更具描述性的异常中),或者只是在方法结束时返回null。如果出现错误,这实际上取决于你想要做什么。

哦,你的in.close()应该在finally块中。否则,您可以正确读取数据,但如果无法关闭流则将其丢弃。

答案 2 :(得分:2)

另外,您是否考虑过第三方序列化程序库?

我现在正在使用Simple进行一个项目,似乎只需很少的努力即可完成任务。

答案 3 :(得分: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;    
    }

答案 4 :(得分:0)

我修改了源代码。我在异常中添加了“return null”,并在函数中添加了for循环输出。该函数为我提供了正确的输出,但随后将其抛出异常。