我得到了下面的代码,但我不明白为什么它打印B.也可以解释一下吗?:
抛出Math.random()> 0.5?new MyException():new RuntimeException();
代码:
// If we have a returned SAS.
BitmapImage myOnlineImage = new BitmapImage();
myOnlineImage.UriSource = new Uri(uploadImage.ImageUri, UriKind.RelativeOrAbsolute);
//ImageOnlineTest.Source = myOnlineImage;
var imageBrush = new ImageBrush
{
ImageSource = myOnlineImage,
Stretch = Stretch.None
};
var source = FindChildShieldCanvas(CanvasImage, imageBrush);
WriteableBitmap wbm = new WriteableBitmap((BitmapImage)myOnlineImage);
ImageOnlineTest.Source = wbm;
谢谢!
答案 0 :(得分:0)
method1
会引发MyException
或RuntimeException
,具体取决于Math.random()
返回的随机数是否高于0.5
。
它始终打印B
,因为无论是否抛出MyException
或RuntimeException
,两者都会被捕获RuntimeException
并打印{{1}的catch块捕获(B
是MyException
)的子类。
答案 1 :(得分:0)
在method1()中,捕获所有RuntimeException并打印“B”。 另一方面,MyException在代码中扩展了RuntimeException。
因此,catch块会捕获所有MyException或RuntimeException并打印'B'
你有'A'从未打印过,因为method1中的catch块通过捕获它来处理异常。您可以通过在方法1的catch块的末尾添加语句throw re;
答案 2 :(得分:0)
首先,
为了清楚起见,我想指出一段代码
throw Math.random() > 0.5 ?new MyException(): new RuntimeException();
被称为if-statement
的内联形式,使用三元运算符?
编写。
所以,基本上,
throw Math.random() > 0.5 ?new MyException(): new RuntimeException();
与
相同if(Math.random() > 0.5){
throw new MyException();
} else{
throw new RuntimeException();
}
有了这个,让我们专注于程序的流程: -
main
方法在method1
块中调用try
。method1
的调用会打开自己的try
块。Math.random()
的调用返回0到1之间的小数值;每次调用返回的值最可能与前一次调用中的值不同。 MyException
调用返回大于Math.random()
的值时,会抛出0.5
个对象。否则,抛出一个RuntimeException
对象。 MyException
类扩展RuntimeException
时,在随机值大于0.5的两种情况下,catch
子句都可以处理这两种异常。这是因为catch
子句可以捕获RuntimeException
,及其所有子类型的所有实例。 可从官方Java教程here参考:
如果抛出的对象可以合法地分配给异常处理程序的参数,系统会认为它是匹配的。
catch
调用的method1
块中。这打印出“B”。catch
块结束时终止,程序流永远不会到达调用方法,在这种情况下为main
方法。因此,“A”永远不会打印出来。我希望这能澄清所涉及的各个方面。