JAVA:如果没有花括号,则关系将继续
我有以下java代码片段JAVA:如果没有花括号,则关系将继续,java,syntax,decompiler,Java,Syntax,Decompiler,我有以下java代码片段 while (condition1){ switch (someinteger){ case 1: if(condition2) continue; // other stuff here break; // other cases here } } 一切都很好。当我生成一个类文件,然后使用免费工具(JDGUI)对其进行反编译时,我得到了以下代码 w
while (condition1){
switch (someinteger){
case 1:
if(condition2) continue;
// other stuff here
break;
// other cases here
}
}
一切都很好。当我生成一个类文件,然后使用免费工具(JDGUI)对其进行反编译时,我得到了以下代码
while (condition1){
switch (someinteger){
case 1:
if(!condition2);
// other stuff here
break;
// other cases here
}
}
因此,如果(条件2)继续,它将改变代码>到如果(!条件2)代码>
我找不到其他if语句的任何信息(没有大括号)。
有人能解释一下这里的逻辑吗?提前谢谢
编辑:我做了更多的测试,反编译器不能正常工作
以下是之前的代码:
public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException{
int commentON=0, quoteON=0;
int b1;
while ((b1 = f1.read()) != -1){
switch ((char) b1){
case '\\':
if (commentON==0){
quoteON = 1;
break;
}
continue;
case '\n':
if (commentON>0){ commentON=0; continue; }
break;
case '%':
if (commentON>0) continue;
if (quoteON>0) { quoteON=0; break; }
commentON=2;
continue;
default:
if (commentON>0) continue;
if (quoteON>0) quoteON=0;
break;
}
f2.write(b1);
}
}
这是反编译的代码
public void strip(InputStreamReader f1, OutputStreamWriter f2) throws IOException
{
int commentON = 0; int quoteON = 0;
while ((b1 = f1.read()) != -1)
{
int b1;
switch ((char)b1)
{
case '\\':
if (commentON == 0);
quoteON = 1;
break;
case '\n':
if (commentON <= 0) break label109; commentON = 0; break;
case '%':
if (commentON <= 0);
if (quoteON > 0) { quoteON = 0; break label109: }
commentON = 2;
break;
}
if (commentON <= 0);
if (quoteON > 0) quoteON = 0;
label109: f2.write(b1);
}
}
public void strip(InputStreamReader f1,OutputStreamWriter f2)引发IOException
{
int commentON=0;int quoteON=0;
而((b1=f1.read())!=-1)
{
int b1;
开关((字符)b1)
{
案例“\\”:
如果(注释==0);
quoteON=1;
打破
案例“\n”:
如果(commentON反编译器在处理编译器对代码的解释时几乎不可能重建您的原始语法
您编写java代码,java编译器将其编译为字节码
反编译器然后尝试从字节码创建java代码
因为这两个代码片段在逻辑上是相同的,所以反编译器完成了它的工作
编辑(查看您的评论):
事实上,反编译器很可能出错(这是很常见的)
如果(!condition2);
语句本质上没有任何效果(前提是condition2确实是布尔代码而不是伪代码)
因此,您的第一个//此处的其他内容
将被处理,而与反编译版本中的条件2
无关
您确定反编译的代码工作正常吗?没有正文的if语句(“没有大括号”)只是一个不执行代码的空if语句。它是相同逻辑的替代/规范表示。反编译器不会保留代码。顺便说一句……我不是在争论反编译代码的正确性。我只是惊讶于if(condition2)continue;
与if(!condition2)相同
这是否意味着执行会自动从正确的点继续(在本例中,从开始,而循环开始)在第一组代码中,如果condition1=true
和someInteger=1
和condition2=true
则//此处的其他内容将不被执行。但在第二个代码块中,具有相同条件的//此处的其他内容将被执行。@David-我同意你的观点,我看不出来。我猜它是在编译时没有在//此处的其他内容
部分中添加任何内容。这将使它在逻辑上正确-只有OP对它的解释是错误的(//此处的其他内容
属于条件的“then”部分)@Anon:-是的,我认为你是对的。OP可能假设这里的其他东西仍然会出现在那里。请参阅@Anon对问题的评论。我同意,要么是反编译器出错,这在我的经验中是很常见的,尽管我没有使用他提到的反编译器。错误-执行n的是if语句如果条件为真,则执行下一行代码;如果条件为假,则跳过该行…@Basic:true通常为真,但您将我的答案断章取义;OP使用短语“无大括号”表示语句if(!condition2);
。