【问题标题】:How to access and ArrayList inside another class inside multiple try's?如何在多个尝试中访问另一个类中的 ArrayList?
【发布时间】:2012-11-01 11:42:52
【问题描述】:

我有一个作业来检索一个 myqsl 查询并将其保存到 ArrayList ,然后将其链接到另一个类,然后将其序列化并通过 http 发送, 在一个计划中,它会是

class Server{static class a   {try{try{  try{arraylist1}  }}}}

class b {var1,var2,link_to(arraylist1)}

然后序列化b类并发送

我设法通过

获取 sql 查询并保存 ArrayList 中的对象(从“Personat”类创建的对象)
     if (rs != null) {
         List<Personat> perList = new ArrayList<Personat>();
         while (rs.next()) {
            Personat per = new Personat();      
            per.setID(rs.getInt("var1"));
            per.setName(rs.getString("var2"));  
            per.setAmount(rs.getInt("var3"));
            perList.add(per);
         }
     }
     Where rs=ResultSet object

但我无法从 b 类访问 ArrayList,因此我可以对其进行序列化。我试图让它成为静态的(什么都没有,它不能被链接)。我试图做一个吸气剂(但没有什么 Eclipse 不会让我自动生成它们)。

所以我不知道我该怎么办!有人能帮我吗 ?或者有人有什么想法吗? 我试图在谷歌上搜索这个,但你可以看到它有点太具体了,所以直到现在还没有结果......

这是我的 Server.java

package server2;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

 public class Server {
private static List<Personat> perList = new ArrayList<Personat>();
 //need to access this in the SendRes class 
public List<Personat> getPerList() {
    return perList;
}

public static void main(String[] args) throws Exception {

    HttpServer server = HttpServer.create(new InetSocketAddress(3333), 0);

    server.createContext("/", new MyHandler());
    server.setExecutor(null); 
    server.start();
}

static public class MyHandler implements HttpHandler {

    public void handle(HttpExchange t) throws IOException {

        ObjectInputStream ios = new ObjectInputStream(t.getRequestBody());
        //
        final String url = "jdbc:mysql://localhost/httpServer";

        final String user = "root";

        final String password = "";

        try {
            Send oin = (Send) ios.readObject();
            int id = oin.getId();
            String emri = oin.getName();
            int amount = oin.getAmount();
            int paid = oin.getPaid();
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user,
                        password);

                try {
                    PreparedStatement s = con
                            .prepareStatement("INSERT INTO person(ID,Name,Amount,Paid) VALUES (?,?,?,?)");
                    s.setInt(1, id);
                    s.setString(2, emri);
                    s.setInt(3, amount);
                    s.setInt(4, paid);
                    s.executeUpdate();

                    ResultSet rs = s.executeQuery("SELECT * "
                            + "from personat ORDER BY EmpId");

                    if (rs != null) {

                        while (rs.next()) {
                            Personat per = new Personat();
                            per.setID(rs.getInt("ID"));
                            per.setName(rs.getString("Name"));
                              per.setAmount(rs.getInt("Amount"));

                            perList.add(per);
                        }
                    }

                    //here i need to send an SendRes object     with the ArrayList inside it 

                } catch (Exception e) {

                    e.printStackTrace();
                } finally {
                    if (con != null) {
                        con.close();
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}
    }

    class SendResponse implements Serializable {
String gabim;
String gabimNr;
    //link the arraylist from class server here
    }

    class Personat {
int ID;

public int getID() {
    return ID;
}

public void setID(int iD) {
    ID = iD;
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public int getAmount() {
    return Amount;
}
public void setAmount(int amount) {
    Amount = amount;
}
String Name;
int Amount;
   }

【问题讨论】:

  • {try{try{ try{arraylist1} }}} 是什么意思?
  • 这意味着,多次尝试,所以一个尝试在一个尝试里面另一个尝试等等,它就像一个计划,所以我可以解释我的自我而无需复制/粘贴我所有的代码,因为它的长和有点复杂,我也不会让别人做我的功课只是为了给我需要的概念......

标签: java serialization arraylist try-catch


【解决方案1】:

B 类型的对象只能访问A 类型的公共成员。要访问您的列表,您需要将其设为A 的公共成员。执行此操作的典型方法是使用私有字段和公共 getter。

class A
{
    private List<Personat> personList;

    public List<Personat> getPersonList() { return personList; }

    public void handle(HttpExchange t) throws IOException
    {
        // ...
        personList = ...;
        // ...
    }
}

请注意,通过公开访问您的列表,您还允许客户修改列表的内容。如果不希望这样做,您可能更愿意给他们一份列表的副本。


顺便说一句,如果你在一个方法中嵌套了三个 try 块,那么该方法可能过于复杂,应该重构为更小的方法。

【讨论】:

  • 我尝试过这样做,但 eclipse 说:无效修饰符只允许最终允许
  • @p3rand0r:您不能在方法中声明类成员。请查看我的代码示例以了解如何声明成员。另请阅读本教程:docs.oracle.com/javase/tutorial/java/javaOO/variables.html
  • 对不起,我把它放在另一个方法句柄(HttpExchange t)中,我无法帮助它,我有句柄(HttpExchange t)方法,尝试使用 httpserver,尝试连接到数据库并尝试查询 ....
  • @p3rand0r:你可以帮助它。您只需将声明移动到正确的位置,就像我在示例中显示的那样,就像在教程中显示的那样。 PS:我不相信你会在 1 分钟内看完我链接的整个教程 - 请再读一遍。
  • 好的,我已经阅读了你的教程,所以我像你说的那样把它变成了一个类变量,但是我在解释我的项目时犯了另一个错误,类 a 是类 Server 的静态类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多