اجعل المترجم على علم بأن وظيفة Java لا تعود أبدًا

1

يستدعي رمز سكالا الخاص بي (تنفيذ deserializer جاكسون) وظيفة Java التي دائمًا ما يتم رميها ( DeserializationContext.handleUnexpectedToken ). إذا كانت هذه دالة Scala ، فسيكون نوع الإرجاع Nothing وسيقوم المترجم بإدراك الكود بعد أن يتعذر الوصول إليه. أستخدم حاليا ??? بعد استدعاء الوظيفة لتمييز هذا ، يمكنني أيضًا استخدام أي throw بدلا من ذلك ، ولكن ربما هناك طريقة أفضل ، بعض التعليقات أو شيء من هذا؟

  class XDeserializer extends StdDeserializer[X](classOf[X]) {
    def deserialize(p: JsonParser, ctxt: DeserializationContext) = {
      if (p.getCurrentToken.equals(JsonToken.VALUE_STRING)) {
        /* .... */
      } else {
        ctxt.handleUnexpectedToken(classOf[X], p)
        ??? // is there a better way?
      }
    }
  }

1 إجابة

1
افضل جواب

EDIT2: TLDR ولا تهتم ، ربما قم ببساطة بلف هذه الوظيفة في دالة لا ترجع شيئًا

أفعل ذلك عادةً بإعلان استثناء كنوع النتيجة. دعني أريك في جافا. يجب أن تترجم بسهولة.

RuntimeException functionThatAlwaysThrows() {
    throw new WhateverRuntimeException();
}

ثم أستخدمها ببساطة عن طريق البادئة بالرمي:

throw functionThatAlwaysThrows();

لاحظ أن "الرمي" المستخدم هنا لا يحدث أبدًا في الواقع ، إنه موجود فقط لإخبار المترجم بما يحدث. نظرًا لأن الاستثناء يتم طرحه داخل الوظيفة ، فلا يوجد تغيير في النتيجة إذا نسي المرء إضافة "الرمية".

في كثير من الأحيان ، سوف يخبرك تحليل تدفق المترجم إذا نسيته ؛ ليس في التعليمات البرمجية الحتمية بالطبع ، ولكن يبدو أن سؤالك يتحدث عن سياق لا يمكن للمرء فيه حذفه.

هناك قرار تصميم لاتخاذ أي نوع من الاستثناء للإعلان كنوع الإرجاع ؛ لا يجب أن يكون مرتبطًا بالاستثناء الذي تم طرحه ، في الواقع ، ولكن ربما يكون أقل إرباكًا إذا كان كذلك. يعمل الاستثناءات المحددة وغير المحددة ، بالطبع ، لكني أخمن أن Scala لم يقم بفحص الاستثناءات.

تحرير: أرى الآن أنك لست المنفذ للوظيفة التي تسمى. لذا أعتقد أن الفكرة ستكون ببساطة لف هذه الوظيفة في وظيفة كما وصفتها. أو ربما تعلن بالفعل عن استثناء كنوع إرجاع؟

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام