小编Jos*_*ner的帖子

Java未初始化的变量,最终带来好奇心

当我遇到一些有趣的代码时,我试图为我正在帮助(Avian)的替代开源JVM提出模糊的测试用例,我很惊讶它没有编译:

public class Test {
    public static int test1() {
        int a;
        try {
            a = 1;
            return a; // this is fine
        } finally {
            return a; // uninitialized value error here
        }
    }
    public static void main(String[] args) {
        int a = test1();
    }
}
Run Code Online (Sandbox Code Playgroud)

最明显的代码路径(我看到的唯一一个)是执行a = 1,"尝试"返回(第一次),然后执行finally,实际返回a.但是,javac抱怨"a"可能尚未初始化:

    Test.java:8: variable a might not have been initialized  
        return a;  
               ^  

我能想到的唯一可能导致/允许不同代码路径的是,如果在try开始之后但在将值1分配给a之前发生了一个模糊的运行时异常 - 类似于OutOfMemoryError或StackOverflowException,但我无法想到这些可能发生在代码中的这个地方的任何情况.

任何更熟悉Java标准细节的人都可以对此有所了解吗?这只是编译器保守的情况 - 因此拒绝编译本来是有效代码的东西 - 或者这里有什么奇怪的事情?

java variables initialization finally

6
推荐指数
2
解决办法
2282
查看次数

自定义Netty ServerChannel实现

我有两个我想要集成的系统,一个使用完全内部网络堆栈,另一个(特别是Flazr)使用Netty.我想通过我们的内部HTTP堆栈代理基于Flazr Netty的RTMP流,以产生一个说RTMPT的系统.

为了实现这一点,我需要一个像套接字一样的Netty对象,但是让我自己做所有"低级"的东西 - 基本上只是将数据包装在HTTP中并将其传递给我们的自定义网络堆栈.换句话说,我不希望Netty为我管理任何套接字 - 我想在套接字和Netty之间插入我自己的东西.

我怀疑正确的方法是扩展AbstractServerChannel并创建一个*Factory类,但我不确定Netty的其余部分是如何预期数据流经ServerChannel的.

我的自定义ServerChannel需要能够:

  • 当新客户端通过我们现有的HTTP系统连接时通知Netty

  • 当数据到达时将数据推送到Netty

  • 根据客户的要求,对Netty的新消息进行轮询

  • HTTP会话超时(或RTMP流干净地关闭)时清除Netty状态

关于ServerChannel,ServerChannelFactory如何实现的任何指针?我发现javadocs在这方面相当缺乏.

一些具体问题:

  • 我的实现应如何回应"InterestOps"类型的东西?

  • ServerChannel.write是什么叫做一直到堆栈的消息?这两种不同的重载是什么?

  • 我如何实现ServerChannel.(dis)connect?

  • 我是否仍然应该通过ServerBootstrap完成所有这些工作,或者这个东西是否太高级?

谢谢!

在有人要求之前:是的,我很乐意用基于Netty的网络堆栈替换我们的自定义网络堆栈,但这是一项庞大的工程任务,我很难理所当然.宝贝的步骤.

netty

1
推荐指数
1
解决办法
1953
查看次数

标签 统计

finally ×1

initialization ×1

java ×1

netty ×1

variables ×1