Java: Сериализация проблемы новичка :-( - PullRequest
0 голосов
/ 07 октября 2008

Я хочу сохранить и сохранить простые почтовые объекты с помощью сериализации, но я всегда получаю сообщение об ошибке и не могу найти его.

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 ]

5 голосов
/ 07 октября 2008

Условия 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  
}
3 голосов
/ 07 октября 2008

Если возникает исключение, вы никогда не получите инструкцию return в getStoredMails. Вам нужно либо сгенерировать исключение, которое вы перехватили (возможно, заключив его в другое более описательное исключение), либо просто вернуть null в конце метода. Это действительно зависит от того, что вы хотите сделать, если есть ошибка.

О, и ваш in.close () должен быть в блоке finally. В противном случае возможно, что вы могли бы нормально прочитать данные, но затем выбросить их, если не можете закрыть поток.

2 голосов
/ 07 октября 2008

С другой стороны, рассматривали ли вы стороннюю библиотеку сериализаторов?

Я сейчас использую Simple для проекта, и кажется, что он отлично работает без особых усилий.

1 голос
/ 07 октября 2008

в блоках обработки исключений метода 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;    
    }
0 голосов
/ 07 октября 2008

Я изменил источник. Я добавил "return null" в исключении и цикл for для вывода в функцию. И функция дает мне правильный вывод, но затем выдает его исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...