[flutter_tool] Some additional input validation for 'version' (#39136)

diff --git a/packages/flutter_tools/lib/src/commands/version.dart b/packages/flutter_tools/lib/src/commands/version.dart
index ed71c55..0fb9e90 100644
--- a/packages/flutter_tools/lib/src/commands/version.dart
+++ b/packages/flutter_tools/lib/src/commands/version.dart
@@ -65,6 +65,10 @@
 
     // check min supported version
     final Version targetVersion = Version.parse(version);
+    if (targetVersion == null) {
+      throwToolExit('Failed to parse version "$version"');
+    }
+
     bool withForce = false;
     if (targetVersion < minSupportedVersion) {
       if (!argResults['force']) {
diff --git a/packages/flutter_tools/test/general.shard/commands/version_test.dart b/packages/flutter_tools/test/general.shard/commands/version_test.dart
index c09ff69..647e657 100644
--- a/packages/flutter_tools/test/general.shard/commands/version_test.dart
+++ b/packages/flutter_tools/test/general.shard/commands/version_test.dart
@@ -62,6 +62,16 @@
       ProcessManager: () => MockProcessManager(),
     });
 
+    testUsingContext('tool exit on confusing version', () async {
+      const String version = 'master';
+      final VersionCommand command = VersionCommand();
+      final Future<void> runCommand = createTestCommandRunner(command).run(<String>['version', version]);
+      expect(() async => await Future.wait<void>(<Future<void>>[runCommand]),
+             throwsA(isInstanceOf<ToolExit>()));
+    }, overrides: <Type, Generator>{
+      ProcessManager: () => MockProcessManager(),
+    });
+
     testUsingContext('exit tool if can\'t get the tags', () async {
       final VersionCommand command = VersionCommand();