<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
<p>Hi all,&nbsp;</p>
<p>&nbsp; &nbsp; I am kind of confused how to solve exception and try-catch&nbsp;in Soot. I find this cuz my program doesn't process the exception and try-catch block&nbsp;instead it deems it as method invocation. I check the jimple code</p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p>public void reduce(org.apache.hadoop.io.Text, java.lang.Iterable, org.apache.hadoop.mapreduce.Reducer$Context) throws java.io.IOException, java.lang.InterruptedException<br /> {<br /> WordCount2$IntSumReducer r0;<br /> org.apache.hadoop.io.Text r1;<br /> java.lang.Iterable r2;<br /> org.apache.hadoop.mapreduce.Reducer$Context r3;<br /> org.apache.hadoop.io.IntWritable r4, $r7, $r8;<br /> java.util.Iterator r5;<br /> boolean $z0;<br /> java.lang.Object $r6;<br /> int $i0, i1;</p>
<p>r0 := @this: WordCount2$IntSumReducer;</p>
<p>r1 := @parameter0: org.apache.hadoop.io.Text;</p>
<p>r2 := @parameter1: java.lang.Iterable;</p>
<p>r3 := @parameter2: org.apache.hadoop.mapreduce.Reducer$Context;</p>
<p>i1 = 0;</p>
<p>r5 = interfaceinvoke r2.&lt;java.lang.Iterable: java.util.Iterator iterator()&gt;();</p>
<p>goto label2;</p>
<p>label1:<br /> $r6 = interfaceinvoke r5.&lt;java.util.Iterator: java.lang.Object next()&gt;();</p>
<p>r4 = (org.apache.hadoop.io.IntWritable) $r6;</p>
<p>$i0 = virtualinvoke r4.&lt;org.apache.hadoop.io.IntWritable: int get()&gt;();</p>
<p>i1 = i1 + $i0;</p>
<p>label2:<br /> $z0 = interfaceinvoke r5.&lt;java.util.Iterator: boolean hasNext()&gt;();</p>
<p>if $z0 != 0 goto label1;</p>
<p>$r7 = r0.&lt;WordCount2$IntSumReducer: org.apache.hadoop.io.IntWritable result&gt;;</p>
<p>virtualinvoke $r7.&lt;org.apache.hadoop.io.IntWritable: void set(int)&gt;(i1);</p>
<p>$r8 = r0.&lt;WordCount2$IntSumReducer: org.apache.hadoop.io.IntWritable result&gt;;</p>
<p>virtualinvoke r3.&lt;org.apache.hadoop.mapreduce.Reducer$Context: void write(java.lang.Object,java.lang.Object)&gt;(r1, $r8);</p>
<p>return;<br /> }</p>
<p>public volatile void reduce(java.lang.Object, java.lang.Iterable, org.apache.hadoop.mapreduce.Reducer$Context) throws java.io.IOException, java.lang.InterruptedException<br /> {<br /> WordCount2$IntSumReducer r0;<br /> java.lang.Object r1;<br /> java.lang.Iterable r2, $r5;<br /> org.apache.hadoop.mapreduce.Reducer$Context r3, $r4;<br /> org.apache.hadoop.io.Text $r6;</p>
<p>r0 := @this: WordCount2$IntSumReducer;</p>
<p>r1 := @parameter0: java.lang.Object;</p>
<p>r2 := @parameter1: java.lang.Iterable;</p>
<p>r3 := @parameter2: org.apache.hadoop.mapreduce.Reducer$Context;</p>
<p>$r6 = (org.apache.hadoop.io.Text) r1;</p>
<p>$r5 = (java.lang.Iterable) r2;</p>
<p>$r4 = (org.apache.hadoop.mapreduce.Reducer$Context) r3;</p>
<p><span style="text-decoration: underline;">virtualinvoke r0.&lt;WordCount2$IntSumReducer: void reduce(org.apache.hadoop.io.Text,java.lang.Iterable,org.apache.hadoop.mapreduce.Reducer$Context)&gt;($r6, $r5, $r4);</span></p>
<p>return;<br /> }</p>
</blockquote>
<p>&nbsp; &nbsp;As you can find that there is a method invocation in the second last line.&nbsp;</p>
<p>&nbsp; &nbsp;Back to source code.</p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0">
<p><span>public</span> <span>void</span> reduce(Text <span>key</span>, Iterable&lt;IntWritable&gt; <span>values</span>,</p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Context <span>context</span></p>
<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ) <span>throws</span> IOException, InterruptedException {</p>
<p>&nbsp; &nbsp; &nbsp; <span>int</span> <span>sum</span> = 0;</p>
<p>&nbsp; &nbsp; &nbsp; <span>for</span> (IntWritable <span>val</span> : <span>values</span>) {</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span>sum</span> += <span>val</span>.get();</p>
<p>&nbsp; &nbsp; &nbsp; }</p>
<p>&nbsp; &nbsp; &nbsp; <span>result</span>.set(<span>sum</span>);</p>
<p>&nbsp; &nbsp; &nbsp; <span>context</span>.write(<span>key</span>, <span>result</span>);</p>
<p>&nbsp; &nbsp; }</p>
</blockquote>
<p>&nbsp; &nbsp;It is fully an exception statement from source code aspect. Therefore, how to resolve this ambiguous case and distinguish<strong> the exception/try-catach </strong>with<strong> method invocation</strong>.&nbsp;</p>
<p>&nbsp; &nbsp;Thanks</p>
<p>Best</p>
<p>Chris.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</body></html>