抛出异常java

时间:2015-11-22 12:05:56

标签: java exception-handling

我得到了下面的代码,但我不明白为什么它打印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;

谢谢!

3 个答案:

答案 0 :(得分:0)

method1会引发MyExceptionRuntimeException,具体取决于Math.random()返回的随机数是否高于0.5

它始终打印B,因为无论是否抛出MyExceptionRuntimeException,两者都会被捕获RuntimeException并打印{{1}的catch块捕获(BMyException)的子类。

答案 1 :(得分:0)

在method1()中,捕获所有RuntimeException并打印“B”。 另一方面,MyException在代码中扩展了RuntimeException。

因此,catch块会捕获所有MyException或RuntimeException并打印'B'

你有'A'从未打印过,因为method1中的catch块通过捕获它来处理异常。您可以通过在方法1的catch块的末尾添加语句throw re;

来重新抛出main方法的异常。

答案 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();
}

有了这个,让我们专注于程序的流程: -

  1. main方法在method1块中调用try
  2. method1的调用会打开自己的try块。
  3. Math.random()的调用返回0到1之间的小数值;每次调用返回的值最可能与前一次调用中的值不同。
  4. 因此,当MyException调用返回大于Math.random()的值时,会抛出0.5个对象。否则,抛出一个RuntimeException对象。
  5. MyException类扩展RuntimeException时,在随机值大于0.5的两种情况下,catch子句都可以处理这两种异常。这是因为catch子句可以捕获RuntimeException及其所有子类型的所有实例。
  6. 可从官方Java教程here参考:

      

    如果抛出的对象可以合法地分配给异常处理程序的参数,系统会认为它是匹配的。

    1. 抛出的Exception对象捕获在catch调用的method1块中。这打印出“B”。
    2. 执行控制在此catch块结束时终止,程序流永远不会到达调用方法,在这种情况下为main方法。因此,“A”永远不会打印出来。
    3. 我希望这能澄清所涉及的各个方面。