diff --git a/core/lib/Drupal/Core/Field/FieldItemList.php b/core/lib/Drupal/Core/Field/FieldItemList.php
index 1067ae8..3d30c56 100644
--- a/core/lib/Drupal/Core/Field/FieldItemList.php
+++ b/core/lib/Drupal/Core/Field/FieldItemList.php
@@ -296,15 +296,17 @@ public function getConstraints() {
    * {@inheritdoc}
    */
   public function defaultValuesForm(array &$form, FormStateInterface $form_state) {
+    // Place the input in a separate place in the submitted values tree.
     if (empty($this->getFieldDefinition()->default_value_callback)) {
-      // Place the input in a separate place in the submitted values tree.
-      $widget = $this->defaultValueWidget($form_state);
+      if ($widget = $this->defaultValueWidget($form_state)) {
+        $element = array('#parents' => array('default_value_input'));
+        $element += $widget->form($this, $element, $form_state);
 
-      $element = array('#parents' => array('default_value_input'));
-      $element += $widget->form($this, $element, $form_state);
-
-      return $element;
+        return $element;
+      }
     }
+
+    return ['#markup' => $this->t('No widget available for: %type.', ['%type' => $this->getFieldDefinition()->getDataType()])];
   }
 
   /**
@@ -312,16 +314,17 @@ public function defaultValuesForm(array &$form, FormStateInterface $form_state)
    */
   public function defaultValuesFormValidate(array $element, array &$form, FormStateInterface $form_state) {
     // Extract the submitted value, and validate it.
-    $widget = $this->defaultValueWidget($form_state);
-    $widget->extractFormValues($this, $element, $form_state);
-    // Force a non-required field definition.
-    // @see self::defaultValueWidget().
-    $this->getFieldDefinition()->setRequired(FALSE);
-    $violations = $this->validate();
+    if ($widget = $this->defaultValueWidget($form_state)) {
+      $widget->extractFormValues($this, $element, $form_state);
+      // Force a non-required field definition.
+      // @see self::defaultValueWidget().
+      $this->getFieldDefinition()->setRequired(FALSE);
+      $violations = $this->validate();
 
-    // Assign reported errors to the correct form element.
-    if (count($violations)) {
-      $widget->flagErrors($this, $violations, $element, $form_state);
+      // Assign reported errors to the correct form element.
+      if (count($violations)) {
+        $widget->flagErrors($this, $violations, $element, $form_state);
+      }
     }
   }
 
@@ -330,9 +333,10 @@ public function defaultValuesFormValidate(array $element, array &$form, FormStat
    */
   public function defaultValuesFormSubmit(array $element, array &$form, FormStateInterface $form_state) {
     // Extract the submitted value, and return it as an array.
-    $widget = $this->defaultValueWidget($form_state);
-    $widget->extractFormValues($this, $element, $form_state);
-    return $this->getValue();
+    if ($widget = $this->defaultValueWidget($form_state)) {
+      $widget->extractFormValues($this, $element, $form_state);
+      return $this->getValue();
+    }
   }
 
   /**
@@ -349,7 +353,7 @@ public static function processDefaultValue($default_value, FieldableEntityInterf
    *   The form state of the (entire) configuration form.
    *
    * @return \Drupal\Core\Field\WidgetInterface
-   *   A Widget object.
+   *   A Widget object or NULL if no widget is available.
    */
   protected function defaultValueWidget(FormStateInterface $form_state) {
     if (!$form_state->has('default_value_widget')) {
diff --git a/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php b/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php
index 42f776a..974b2e6 100644
--- a/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php
+++ b/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php
@@ -10,6 +10,7 @@
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Field\FieldItemInterface;
 use Drupal\Core\Field\FieldItemList;
+use Drupal\Core\Form\FormState;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -155,4 +156,68 @@ public function testEqualsEmptyItems() {
     $this->assertEquals(TRUE, $field_list_a->equals($field_list_b));
   }
 
+  /**
+   * @covers ::defaultValuesForm
+   *
+   * @test
+   */
+  public function defaultValuesForm() {
+    $field_definition = $this->getMock('DrupalFormStateInterface\Core\Field\FieldDefinitionInterface', ['getDataType']);
+    $field_definition->expects($this->any())
+      ->method('getDataType')
+      ->willReturn('field_type');
+    $field_list = $this->getMock('Drupal\Core\Field\FieldItemList', ['defaultValueWidget'], [$field_definition]);
+    $field_list->expects($this->any())
+      ->method('defaultValueWidget')
+      ->willReturn(NULL);
+    $form = [];
+    $form_state = new FormState();
+    $stringTranslation = $this->getMockBuilder('Drupal\Core\StringTranslation\TranslationManager')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $stringTranslation->expects($this->any())
+      ->method('translate')
+      ->willReturn('No widget available for: field_type.');
+    $field_list->setStringTranslation($stringTranslation);
+
+    $this->assertEquals($field_list->defaultValuesForm($form, $form_state)['#markup'], 'No widget available for: field_type.');
+  }
+
+  /**
+   * @covers ::defaultValuesFormValidate
+   *
+   * @test
+   */
+  public function defaultValuesFormValidate() {
+    $field_definition = $this->getMock('DrupalFormStateInterface\Core\Field\FieldDefinitionInterface');
+    $field_list = $this->getMock('Drupal\Core\Field\FieldItemList', ['defaultValueWidget', 'getFieldDefinition'], [$field_definition]);
+    $field_list->expects($this->any())
+      ->method('defaultValueWidget')
+      ->willReturn(NULL);
+    $field_list->expects($this->never())
+      ->method('getFieldDefinition');
+    $form = [];
+    $form_state = new FormState();
+
+    $field_list->defaultValuesFormValidate([], $form, $form_state);
+  }
+
+  /**
+   * @covers ::defaultValuesFormSubmit
+   *
+   * @test
+   */
+  public function defaultValuesFormSubmit() {
+    $field_definition = $this->getMock('DrupalFormStateInterface\Core\Field\FieldDefinitionInterface');
+    $field_list = $this->getMock('Drupal\Core\Field\FieldItemList', ['defaultValueWidget', 'getValue'], [$field_definition]);
+    $field_list->expects($this->any())
+      ->method('defaultValueWidget')
+      ->willReturn(NULL);
+    $form = [];
+    $form_state = new FormState();
+    $field_list->expects($this->never())
+      ->method('getValue');
+
+    $this->assertNull($field_list->defaultValuesFormSubmit([], $form, $form_state));
+  }
 }
