Java Exception Rethrowing

本文介绍Java中使用fillInStackTrace()方法更新异常堆栈跟踪信息的技术。通过两个示例对比展示如何改变异常来源位置,使得异常重抛时能反映最新的堆栈信息。

Java Exception Rethrowing

                                                                      ------------- fillInStackTrace ()

 

The fillInStackTrace () method is to fill in the execution stack trace. This method records within this Throwable object information about the current state of the stack frames for the current thread. It will return a reference to a Throwable object, which is useful when rethrow an exception or an exception.

 

For example 1,

public class FillStackTrace {

         public static void f()throws Exception{

                  System.out.println("f() throws an Exception");

                   throw new Exception("From f()");

         }

         public static void g() throws Exception {

                   try{

                            f();

                  }catch(Exception e){

                            System.err.println("cault in g()");

                            e.printStackTrace();

                            throw e;

                   }

         }

        

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

                   try{

                            g();

                  }catch(Exception e){

                            System.err.println("cault in main");

                            e.printStackTrace();

                   }

         }

}

 

Output:

f() throws an Exception

cault in g()

java.lang.Exception: From f()

    at FillStackTrace.f(FillStackTrace.java:5)

    at FillStackTrace.g(FillStackTrace.java:9)

    at FillStackTrace.main(FillStackTrace.java:22)

cault in main

java.lang.Exception: From f()

    at FillStackTrace.f(FillStackTrace.java:5)

    at FillStackTrace.g(FillStackTrace.java:9)

    at FillStackTrace.main(FillStackTrace.java:22)

 

You can see the out from the line “e.printStackTrace()” in main method:

at FillStackTrace.f(FillStackTrace.java:5)

    at FillStackTrace.g(FillStackTrace.java:9)

    at FillStackTrace.main(FillStackTrace.java:22)

 

The information you print about the exception in printStackTrace () of f() method includes the exception origin, not the place where you rethrow it. Because rethrowing an exception will cause it to go to the exception handlers in the next-higher context. Any further catch in the same try block will be ignored. Everything about the exception object is preserved, so the handler at the higher context that catches the specific exception type can extract all the information from that object.

 

If you want to change the origin of the exception to the place where you rethrow it, use fillInStackTrace (), which returns a Throwable object that it creates by stuffing the current stack information into the old exception object. 

For example 2:

public class FillStackTrace {

         public static void f() throws Exception{

                  System.out.println("f() throws an Exception");

                   throw new Exception("From f()");

         }

         public static void g() throws Throwable {

                   try{

                            f();

                  }catch(Exception e){

                            System.err.println("cault in g()");

                            e.printStackTrace();

                            throw e .fillInStackTrace();

                   }

         }

        

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

                   try{

                            g();

                  }catch(Exception e){

                            System.err.println("cault in main");

                            e.printStackTrace();

                   }

         }

}

 

Output:

f() throws an Exception

cault in g()

java.lang.Exception: From f()

    at FillStackTrace.f(FillStackTrace.java:6)

    at FillStackTrace.g(FillStackTrace.java:10)

    at FillStackTrace.main(FillStackTrace.java:23)

cault in main

java.lang.Exception: From f()

    at FillStackTrace.g(FillStackTrace.java:14)

    at FillStackTrace.main(FillStackTrace.java:23)

 

The different between example 1 and example 2 are the rethrowing line and the exception specification of method main and g. Because fillInStackTrace () produces a reference to a Throwable object, since Throwable is the base class of Exception.

 

@Test @Timeout(value = 10, unit = TimeUnit.SECONDS) void testResponseTimeout() throws InterruptedException { // 定义一个不响应的服务器(覆盖createChannelInitializer) TcpServer nonResponsiveServer = new TcpServer() { @Override protected ChannelInitializer createChannelInitializer() { return new ChannelInitializer() { @Override protected void initChannel(SocketChannel ch) { // 仅保留解码器,移除业务处理器和编码器(不返回响应) ch.pipeline().addLast( new LengthFieldFrameDecoder(), new JsonRequestDecoder() ); } }; } }; // 启动服务器线程(处理InterruptedException) Thread nonResponsiveServerThread = new Thread(() -> { try { nonResponsiveServer.start(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 恢复中断状态 LOG.error("服务器启动被中断", e); } }); nonResponsiveServerThread.start(); // 等待服务器启动(根据实际情况调整等待时间) Thread.sleep(3000); // 客户端连接并发送请求(验证超时) TcpClient client = new TcpClient("127.0.0.1", 8080); client.connect(); GreetRequest request = new GreetRequest(); request.setName("TimeoutUser"); GreetResponse response = client.sendRequest(request); assertThat(response).isNull(); // 预期超时返回null // 清理资源 client.shutdown(); nonResponsiveServer.shutdown(); nonResponsiveServerThread.join(3000); } @Test @Timeout(value = 10, unit = TimeUnit.SECONDS) // 防止测试卡住 void testNormalCommunication() throws InterruptedException { // 初始化客户端 TcpClient client = new TcpClient("127.0.0.1", TEST_PORT); client.connect(); // 构造请求 GreetRequest request = new GreetRequest(); request.setName("TestUser"); // 发送请求并等待响应 GreetResponse response = client.sendRequest(request); // 验证响应 assertThat(response).isNotNull(); assertThat(response.getMessage()).isEqualTo("Hello, TestUser!"); // 关闭客户端 client.shutdown(); }报错Exception in thread "Thread-3" java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:461) at sun.nio.ch.Net.bind(Net.java:453) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:222) at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:148) at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:434) at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1353) at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:492) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:471) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:994) at io.netty.channel.Channel.bind(Channel.java:302) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:380) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:141) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at --- Async.Stack.Trace --- (captured by IntelliJ IDEA debugger) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.bootstrap.AbstractBootstrap.doBind0(AbstractBootstrap.java:376) at io.netty.bootstrap.AbstractBootstrap.access$000(AbstractBootstrap.java:54) at io.netty.bootstrap.AbstractBootstrap$1.operationComplete(AbstractBootstrap.java:315) at io.netty.bootstrap.AbstractBootstrap$1.operationComplete(AbstractBootstrap.java:302) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:649) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:638) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:118) at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:861) at io.netty.channel.AbstractChannel$AbstractUnsafe$2.operationComplete(AbstractChannel.java:385) at io.netty.channel.AbstractChannel$AbstractUnsafe$2.operationComplete(AbstractChannel.java:374) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:649) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:638) at io.netty.util.concurrent.DefaultPromise.setSuccess(DefaultPromise.java:110) at io.netty.channel.DefaultChannelPromise.setSuccess(DefaultChannelPromise.java:78) at io.netty.channel.DefaultChannelPromise.setSuccess(DefaultChannelPromise.java:73) at io.netty.channel.nio.AbstractNioChannel.lambda$doRegister$0(AbstractNioChannel.java:465) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:198) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:36) at io.netty.channel.nio.AbstractNioChannel.doRegister(AbstractNioChannel.java:462) at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:408) at io.netty.channel.AbstractChannel$AbstractUnsafe.access$300(AbstractChannel.java:288) at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:352) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:141) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at --- Async.Stack.Trace --- (captured by IntelliJ IDEA debugger) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:349) at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:119) at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:113) at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86) at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:339) at io.netty.bootstrap.AbstractBootstrap.doBind(AbstractBootstrap.java:288) at io.netty.bootstrap.AbstractBootstrap.bind(AbstractBootstrap.java:284) at io.netty.bootstrap.AbstractBootstrap.bind(AbstractBootstrap.java:262) at server.TcpServer.start(TcpServer.java:75) at TcpServerClientTest.lambda$startServer$0(TcpServerClientTest.java:45) at java.lang.Thread.run(Thread.java:750) Suppressed: java.util.concurrent.CompletionException: Rethrowing promise failure cause at io.netty.util.concurrent.DefaultPromise.rethrowIfFailed(DefaultPromise.java:685) at io.netty.util.concurrent.DefaultPromise.sync(DefaultPromise.java:419) at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:119) at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:30) ... 3 more Exception in thread “Thread-4” java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:461) at sun.nio.ch.Net.bind(Net.java:453) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:222) at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:148) at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:434) at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1353) at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:492) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:471) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:994) at io.netty.channel.Channel.bind(Channel.java:302) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:380) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:141) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at — Async.Stack.Trace — (captured by IntelliJ IDEA debugger) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.bootstrap.AbstractBootstrap.doBind0(AbstractBootstrap.java:376) at io.netty.bootstrap.AbstractBootstrap.access$000(AbstractBootstrap.java:54) at io.netty.bootstrap.AbstractBootstrap$1.operationComplete(AbstractBootstrap.java:315) at io.netty.bootstrap.AbstractBootstrap$1.operationComplete(AbstractBootstrap.java:302) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:649) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:638) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:118) at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:861) at io.netty.channel.AbstractChannel$AbstractUnsafe$2.operationComplete(AbstractChannel.java:385) at io.netty.channel.AbstractChannel$AbstractUnsafe$2.operationComplete(AbstractChannel.java:374) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:649) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:638) at io.netty.util.concurrent.DefaultPromise.setSuccess(DefaultPromise.java:110) at io.netty.channel.DefaultChannelPromise.setSuccess(DefaultChannelPromise.java:78) at io.netty.channel.DefaultChannelPromise.setSuccess(DefaultChannelPromise.java:73) at io.netty.channel.nio.AbstractNioChannel.lambda$doRegister$0(AbstractNioChannel.java:465) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:198) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:36) at io.netty.channel.nio.AbstractNioChannel.doRegister(AbstractNioChannel.java:462) at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:408) at io.netty.channel.AbstractChannel$AbstractUnsafe.access$300(AbstractChannel.java:288) at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:352) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:141) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at — Async.Stack.Trace — (captured by IntelliJ IDEA debugger) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:349) at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:119) at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:113) at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86) at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:339) at io.netty.bootstrap.AbstractBootstrap.doBind(AbstractBootstrap.java:288) at io.netty.bootstrap.AbstractBootstrap.bind(AbstractBootstrap.java:284) at io.netty.bootstrap.AbstractBootstrap.bind(AbstractBootstrap.java:262) at server.TcpServer.start(TcpServer.java:75) at TcpServerClientTest.lambda$testResponseTimeout$1(TcpServerClientTest.java:119) at java.lang.Thread.run(Thread.java:750) Suppressed: java.util.concurrent.CompletionException: Rethrowing promise failure cause at io.netty.util.concurrent.DefaultPromise.rethrowIfFailed(DefaultPromise.java:685) at io.netty.util.concurrent.DefaultPromise.sync(DefaultPromise.java:419) at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:119) at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:30) … 3 more [main] INFO client.TcpClient - 客户端连接成功,目标地址:127.0.0.1:8080 Duplicate field name “$hits$” with signature “[I” in class file io/netty/buffer/AllocateChunkEvent JfrClassAdapter: unable to create InstanceKlass Duplicate field name “$hits$” with signature “[I” in class file io/netty/buffer/AllocateBufferEvent JfrClassAdapter: unable to create InstanceKlass Duplicate field name “$hits$” with signature “[I” in class file io/netty/buffer/FreeBufferEvent JfrClassAdapter: unable to create InstanceKlass [main] INFO server.TcpServer - 服务器已关闭 org.opentest4j.AssertionFailedError: expected: null but was: model.GreetResponse@e7529ac 预期:null 实际:model.GreetResponse@e7529ac;Exception in thread “Thread-5” java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:461) at sun.nio.ch.Net.bind(Net.java:453) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:222) at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:148) at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:434) at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1353) at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:492) at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:471) at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:994) at io.netty.channel.Channel.bind(Channel.java:302) at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:380) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:141) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at — Async.Stack.Trace — (captured by IntelliJ IDEA debugger) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.bootstrap.AbstractBootstrap.doBind0(AbstractBootstrap.java:376) at io.netty.bootstrap.AbstractBootstrap.access$000(AbstractBootstrap.java:54) at io.netty.bootstrap.AbstractBootstrap$1.operationComplete(AbstractBootstrap.java:315) at io.netty.bootstrap.AbstractBootstrap$1.operationComplete(AbstractBootstrap.java:302) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:649) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:638) at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:118) at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:861) at io.netty.channel.AbstractChannel$AbstractUnsafe$2.operationComplete(AbstractChannel.java:385) at io.netty.channel.AbstractChannel$AbstractUnsafe$2.operationComplete(AbstractChannel.java:374) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:649) at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:638) at io.netty.util.concurrent.DefaultPromise.setSuccess(DefaultPromise.java:110) at io.netty.channel.DefaultChannelPromise.setSuccess(DefaultChannelPromise.java:78) at io.netty.channel.DefaultChannelPromise.setSuccess(DefaultChannelPromise.java:73) at io.netty.channel.nio.AbstractNioChannel.lambda$doRegister$0(AbstractNioChannel.java:465) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:603) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:570) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:505) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:198) at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:36) at io.netty.channel.nio.AbstractNioChannel.doRegister(AbstractNioChannel.java:462) at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:408) at io.netty.channel.AbstractChannel$AbstractUnsafe.access$300(AbstractChannel.java:288) at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:352) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:141) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java) at — Async.Stack.Trace — (captured by IntelliJ IDEA debugger) at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:907) at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:873) at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:863) at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:349) at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:119) at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:113) at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86) at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:339) at io.netty.bootstrap.AbstractBootstrap.doBind(AbstractBootstrap.java:288) at io.netty.bootstrap.AbstractBootstrap.bind(AbstractBootstrap.java:284) at io.netty.bootstrap.AbstractBootstrap.bind(AbstractBootstrap.java:262) at server.TcpServer.start(TcpServer.java:75) at TcpServerClientTest.lambda$startServer$0(TcpServerClientTest.java:45) at java.lang.Thread.run(Thread.java:750) Suppressed: java.util.concurrent.CompletionException: Rethrowing promise failure cause at io.netty.util.concurrent.DefaultPromise.rethrowIfFailed(DefaultPromise.java:685) at io.netty.util.concurrent.DefaultPromise.sync(DefaultPromise.java:419) at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:119) at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:30) … 3 more [main] INFO server.TcpServer - 服务器已关闭 [main] INFO client.TcpClient - 客户端连接成功,目标地址:127.0.0.1:8080 [main] INFO client.TcpClient - 客户端已关闭 [main] INFO server.TcpServer - 服务器已关闭 org.opentest4j.AssertionFailedError: Expecting value to be true but was false 预期:true 实际:false 请分析原因并尝试解决
最新发布
08-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值