4

someMethodThatMightThrowException他の場所で定義されている、この Java コードに相当する Scala は何ですか?

class MyClass {
    String a;
    String b;

    MyClass() {
        try {
            this.a = someMethodThatMightThrowException();
            this.b = someMethodThatMightThrowException();
        } finally {
            System.out.println("Done");
        }
    }
}
4

4 に答える 4

1

より近いものはどうですか:

scala> def foo = ???
foo: Nothing

scala> :pa
// Entering paste mode (ctrl-D to finish)

case class Foo(a: String = Foo.afoo, b: String = Foo.bfoo)
object Foo {
import util._
def afoo = Try (foo) recover { case _ => "a" } get
def bfoo = Try (foo) recover { case _ => "b" } get
}

// Exiting paste mode, now interpreting.

warning: there were 2 feature warning(s); re-run with -feature for details
defined class Foo
defined object Foo

scala> Foo()
res0: Foo = Foo(a,b)
于 2013-09-03T20:32:39.040 に答える
1

コンパニオン オブジェクトで

case class MyClass(a: String, b: String)

object MyClass {
   def apply() = try { 
      new MyClass(
         a = someMethodThatMightThrowException(), 
         b = someMethodThatMightThrowException()
      ) 
   } finally {
      println("Done") 
   }
}

this(...) をラップできないため、コンストラクターのオーバーロードは少し難しくなります。

def tryIt[T](something: => T) = try{
      something
   } finally {
      println("Done") 
   }

case class MyClass(a: String, b: String) {
   def this() = this(
      tryIt(someMethodThatMightThrowException),  
      tryIt(someMethodThatMightThrowException)
   ) 
}
于 2013-09-03T18:16:31.790 に答える
1

例外が発生した場合、何が割り当てられますaか? bラップabTry、例外的なケースを処理します。これらのパターン マッチで値を抽出することもできます。

scala> class MyClass(val a: Try[String], val b: Try[String])
defined class MyClass

scala> new MyClass(Try("foo"(0).toString), Try("foo"(3).toString))
res0: MyClass = MyClass@6bcc9c57

scala> res0.a
res1: scala.util.Try[String] = Success(f)

scala> res0.b
res2: scala.util.Try[String] = Failure(java.lang.StringIndexOutOfBoundsException: String index out of range: 3)

scala> res0.a.get
res3: String = f

scala> res0.b.get
java.lang.StringIndexOutOfBoundsException: String index out of range: 3
        at java.lang.String.charAt(String.java:658)
        ...

コメント用に編集。aとにデフォルトの引数を使用しますb

null悪いですが、それはあなたが求めたものです。オプションを見る

class MyClass(val a: Try[String] = null, val b: Try[String] = null)

scala> new MyClass(Success("a"))
res50: MyClass = MyClass@625aaaca

scala> res50.a
res51: scala.util.Try[String] = Success(a)

scala> res50.b
res52: scala.util.Try[String] = null

scala> new MyClass(b = Success("b"))
res53: MyClass = MyClass@68157e85

scala> res53.a
res54: scala.util.Try[String] = null

scala> res53.b
res55: scala.util.Try[String] = Success(b)
于 2013-09-03T18:17:31.140 に答える