Java Casting 使 websocket 崩溃

Posted

技术标签:

【中文标题】Java Casting 使 websocket 崩溃【英文标题】:Java Casting crashes websocket 【发布时间】:2021-12-11 21:35:03 【问题描述】:

所以我有一个奇怪的问题。 我正在连接到 websocket。

随着数据流入,一切都很好。

@Override
public void onMessage(WebSocket webSocket, String text) 

      // My data looks like 
      // "Type":3, "F":[1,2,3974.909912109375,27500,1639207185]

      obj = new JSONObject(text);
      // Then I get the array in "F" key
      o = obj.getJSONArray("F");

     // I want to now cast these variables into variables to use.
   
     // So I do...
     Integer v = (Integer) o.get(0);
     Integer t = (Integer) o.get(1);

     // This works fine.  
     // If I stop here.....
     // the websocket stays connected, and keeps streaming....

     // However.... if I do this....
     Double p = (Double) o.get(2);

    // The websocket crashes, and disconnects??
    // Program continues running though and there is no exceptions.
    // Its merely disconnecting the socket for some reason, by casting?

 

这是怎么回事?? 为什么我不能把它转换成双倍??

我也尝试过 Float,但没有成功。

有什么想法吗??

Iva 也试过了……

Double p = new Double((Integer) o.get(2));
Double p = new Double((Float) o.get(2));
Float p = (Float) o.get(2);
float p = (float) o.get(2);
double p  = Double.parseDouble((String) o.get(2));

所有这些都会导致 websocket 崩溃/断开。

似乎当我尝试访问索引 2 时,事情变得不稳定。 不过……

我可以的

System.out.println(o.get(2));

很好,它会打印出来

3974.909912109375

【问题讨论】:

您的代码可能只是因为转换不起作用而崩溃,您需要检查堆栈跟踪/日志。或者将语句包装在 try-catch 中,捕获每个异常并记录异常以调试正在发生的事情。 控制台/stderr 上某处的堆栈跟踪必须存在异常。否则尝试System.out.println(o.get(2).getClass()) 来查看第三个元素的实际类型。 好吧,这行得通,我发现它是一个 BigDecimal。所以现在我将它转换为 BigDecimal 及其工作。但是.....现在我有另一个问题,那就是使 websocket 崩溃,但没有产生堆栈跟踪。尝试 lastPrice = p 捕获(异常 e) e.printStackTrace() 。 lastPrice 是一个 BigDecimal,我只想在每次迭代时将 p 分配给它。但这现在也会使套接字崩溃。但是,......无一例外 好吧想通了。所以有时那个索引项可以是一个整数。所以当我 System.out.println(o.get(2).getClass()) 时,它会在 bigdecimal 和 integer 之间来回切换。所以我显然必须先检查它是什么,然后根据它进行分配。 你可以做new BigDecimal(o.get(2).toString()); 【参考方案1】:

您不能直接将其转换为 Double。而是尝试使用

Double p = Double.parseDouble(o.get(2));

话虽如此,保持数据一致并将所有内容都转换为Double 可能会更好,以避免出现问题。

String text = "1,2,3974.909912109375,27500,1639207185";
String[] inputs = text.split(",");
List<Double> doubles = Arrays.stream(inputs)
    .map(Double::parseDouble)
    .collect(Collectors.toList());

【讨论】:

以上是关于Java Casting 使 websocket 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使接收到的Websocket事件进行异步处理的最佳方法

如何使我的 websockets 客户端在代理服务器方面健壮?

带代理的 Java websocket

`R.string.cast_casting_to_device`在哪个包中

WebSocket实践——Java实现WebSocket的两种方式

Python Casting