gpt4 book ai didi

java - 无法访问其他类中的 public static Vector 对/数据?

转载 作者:行者123 更新时间:2023-12-01 19:58:32 32 4
gpt4 key购买 nike

我正在尝试编写一个带有两个线程的程序,第一个线程接收一些UDP数据包并将数据和时间戳写入 vector 中,第二个线程偶尔从 vector 中读取并将其发送到其他电脑通过http。代码中最相关的部分可能是:

public class empfaenger extends Thread {
public static Vector<Vector> db = new Vector<Vector>();

public static void main(String[] args) throws IOException {
//Vector<Vector> db = new Vector<Vector>(); //previous solution before trying to implement multihreading
db.add(0, new Vector<String>());
db.add(1, new Vector<Pair<Integer, Timestamp> >());
db.add(2, new Vector<Pair<Integer, Timestamp> >());
db.add(3, new Vector<Pair<Integer, Timestamp> >());

InetAddress empfangadresse = InetAddress.getByName("127.0.0.1");
DatagramSocket socketeins = new DatagramSocket(50, empfangadresse);

httpserverklassetest konkreterserver = new httpserverklassetest();
konkreterserver.start();

while (0 != 1) {
//receive and write data

class httpserverklassetest extends Thread{

//public void httpserverklasse() throws IOException {
@Override
public void run() {
try {
System.out.println("in anderem thread");

//for (Pair<Integer, Timestamp> aktpair : empfaenger.db.get(1)) { //doesn't work
for (int i = 0; i < empfaenger.db.get(1).size(); i++) {
empfaenger.db.get(1).get(i).getKey(); //current code, but doesn't work either
//Intellij doesn't even show the getKey()/marks it red

}

所以问题似乎是运行函数不知道“外部” vector 内的 vector 已经在主函数开始时分配给它们特定的数据类型,但我该如何修复那(如果这是问题所在)?
(两个线程在作为单独的程序启动时以及将它们以多线程方式组合在一起后都可以工作,但是当尝试在第二个类/线程内迭代第一个类内声明的 vector 时,程序停止工作。)
感谢您的帮助

<小时/>

完整代码:

import javafx.util.Pair;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.*;
import java.nio.ByteBuffer;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Vector;


public class empfaenger extends Thread {
public static Vector<Vector> db = new Vector<Vector>();



public static void main(String[] args) throws IOException {
//Vector<Vector<String>> db = new Vector<Vector<String>>(); //geht allein iwie nicht
//Vector<Vector> db = new Vector<Vector>();
db.add(0, new Vector<String>());
db.add(1, new Vector<Pair<Integer, Timestamp> >());
db.add(2, new Vector<Pair<Integer, Timestamp> >());
db.add(3, new Vector<Pair<Integer, Timestamp> >());

InetAddress empfangadresse = InetAddress.getByName("127.0.0.1");
DatagramSocket socketeins = new DatagramSocket(50, empfangadresse);

httpserverklassetest konkreterserver = new httpserverklassetest();
konkreterserver.start();

while (0 != 1) {



byte[] empfangbytearray = new byte[65000]; //ACHTUNG NICHT GANZ GENAU ENTSPRECHEND MAXIMALGRÖßE
DatagramPacket empfangpaket = new DatagramPacket(empfangbytearray, empfangbytearray.length);
socketeins.receive(empfangpaket);


//String teststring = new String(empfangpaket.getData().toString());
String teststring = new String(empfangbytearray, 0, empfangpaket.getLength()); //von stackoverflow
System.out.println("bla" + teststring + "bla");


if (empfangpaket.getPort() == 90) { //speicherformat abstimmen

}
else if (empfangpaket.getPort() == 91) {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
Pair<Integer, Timestamp> einfuegepair = new Pair<>( Integer.parseInt(teststring), timestamp);
db.get(1).addElement(einfuegepair);
}
else if (empfangpaket.getPort() == 92){
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
Pair<Integer, Timestamp> einfuegepair = new Pair<>( Integer.parseInt(teststring), timestamp); //...
db.get(2).addElement(einfuegepair);
}
else if (empfangpaket.getPort() == 93){
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
Pair<Integer, Timestamp> einfuegepair = new Pair<>( Integer.parseInt(teststring), timestamp); //Pair<Integer, Timestamp> einfuegepair = new Pair<>( Integer.parseInt(String.valueOf(teststring.charAt(2))), timestamp); //...
//db.get(3).addElement( String.valueOf(teststring.charAt(2)) ); //db.get(3).get(2 /*db.get(3).size()*/) = String.valueOf(teststring.charAt(3));
db.get(3).addElement(einfuegepair);
}
}

}
}


class httpserverklassetest extends Thread{

//public void httpserverklasse() throws IOException {
@Override
public void run() {
try {
System.out.println("in anderem thread");

//for (Pair<Integer, Timestamp> aktpair : empfaenger.db.get(1)) { //geht iwie nicht
for (int i = 0; i < empfaenger.db.get(1).size(); i++) {
empfaenger.db.get(1).get(i).getKey();

}



ServerSocket testserver = new ServerSocket(80);
while (true != false) {
Socket aktclient = testserver.accept(); //accept wartet wohl bis jmd connected und gibt dann diese verbindung zurück


InputStreamReader isr = new InputStreamReader(aktclient.getInputStream());
BufferedReader reader = new BufferedReader(isr);
String line = reader.readLine();


// if (line.indexOf('?') != -1) {
// String einschraenkungenstr = line.substring(line.indexOf('?')+1);
// String akteinschraenkung;
//
// while (! einschraenkungenstr.isEmpty()){ //not empty oder so; //war mal aufwändiger gedacht aber gar nicht gefordert daher logik zur argumenteabarbeitung nicht unbedingt notwendig
// //if (einschraenkungenstr.charAt(0) == '&') {einschraenkungenstr = einschraenkungenstr.substring(1); } //ka was remove ist
// if (einschraenkungenstr.contains("&")) {
// akteinschraenkung = einschraenkungenstr.substring(0, einschraenkungenstr.contains("&");
// einschraenkungenstr = einschraenkungenstr.substring(1); //entferne & ganz am anfang //alternativ wieder contains und davon dan +1 und dann substring
// }
// else {akteinschraenkung = einschraenkungenstr;}
//
// Integer akteinschraenkunggleichpos = akteinschraenkung.indexOf('=');
// String aktkriterium = akteinschraenkung.substring(0, akteinschraenkunggleichpos);
// String aktkriteriumwert = akteinschraenkung.substring(akteinschraenkunggleichpos+1);
//
// if (aktkriterium == "einzigeskriterium") { //a hier ohne mehrargumentlogik da bemerkt dasw wohl nicht zwingend
// switch (aktkriteriumwert) {
// case "1":
// rueck ==
// break;
// }
//
// }
// else {
// System.out.println("Falsches Kriterium");
// }
//
//
// }
//
// }


while (!line.isEmpty()) { //kopiert aus indien zur ausgabe
System.out.println(line);
line = reader.readLine();
}
Date today = new Date();
String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
aktclient.getOutputStream().write(httpResponse.getBytes("UTF-8"));

}

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

最佳答案

db定义为Vector<Vector>> ,所以db.get(i).get(j)返回类型 Object而不是您期望的 Pair<...> 。

也许你应该使用的是 Vector<Vector<Pair<Integer, Timestamp>>> db = ... ,但是您有混合内容,您将添加到 db Vector<String>以及 Vector<Pair<...>> .

因此,要么在概念上将字符串 vector 和成对 vector 分开(我建议这样做),要么在循环中检查 vector 内容的类,相应地转换和访问它们,例如

Vector v = empfaenger.db.get(1);
if (v.size() > 0 && v.get(1) instanceof Pair)
{
Pair<...> p = (Pair<...>) v.get(1);
}

我个人觉得丑陋得无法形容。

由于您使用对 vector 将端口号映射到对,因此您可以选择 HashMap<Integer, Pair<...>> portMap为此,您可以编写

Pair<...> p = portMap.get(empfangpaket.getPort());
if (p != null)
{
...
}

关于java - 无法访问其他类中的 public static Vector<Vector> 对/数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59019658/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com