@xetorthio Hello!
Since commands within multi in pipeline (a bit complex ;) ) response could be built with exec() response, so it's mandatory to call exec()'s response's get() before command's response's get().
(That's why Pipeline.syncAndReturnAll() has no problem on it. Pipeline.syncAndReturnAll() reads all response's get() and exec()'s response, too.)
But user couldn't know that while he/she doesn't read about Jedis Pipeline source code deeply.

So I would introduce "response dependency". It means that "dependency" should be built before we get response.
At this case, command inside multi in pipeline's dependency is exec()'s response.

Let me explain with included unit test.

````
 @Test
 public void multiWithSync() {
 	jedis.set("foo", "314");
 	jedis.set("bar", "foo");
 	jedis.set("hello", "world");
 	Pipeline p = jedis.pipelined();
 	Response<String> r1 = p.get("bar");
 	p.multi();
 	Response<String> r2 = p.get("foo");
 	p.exec();
 	Response<String> r3 = p.get("hello");
 	p.sync();
 	
 	// before multi
 	assertEquals("foo", r1.get());
 	// It should be readable whether exec's response was built or not
 	assertEquals("314", r2.get());
 	// after multi
 	assertEquals("world", r3.get());
 }
````

r2 could not built while p.exec()'s response is not built.

Let me know if you need more explanation and example.

Thanks! :)