TicTacToe गेम के लिए जावा शुरुआती ट्यूटोरियल के लिए मैं एक विधि लिख रहा हूं जो मुझे अपवाद दे रहा है। मैं पूछना चाहता हूं कि क्या कोई कृपया इसे ठीक करने में मेरी मदद कर सकता है और समझा सकता है कि ऐसा क्यों हुआ?

कार्य के लिए विवरण है:

उपयोगकर्ता इनपुट में एक सफेद स्थान से अलग किए गए 2 सकारात्मक पूर्णांक होते हैं। यदि उपयोगकर्ता शब्दों में टाइप करता है तो एक त्रुटि संदेश को उपयोगकर्ता को संख्याओं का उपयोग करने के लिए कहना चाहिए, यदि संख्या नकारात्मक है या हमारी सीमा है तो संदेश संख्या 1-3 का उपयोग करने के लिए कहता है।

मैं दो शब्द "एक" और "दो" दर्ज करके इसका परीक्षण कर रहा था, कोड सही ढंग से संख्याओं को दर्ज करने के लिए कहता है। जब मैं अब पूर्णांक "1" और "2" दर्ज करता हूं तो विधि इसके अंत तक चलती है लेकिन फिर अपवाद को क्रैश कर देती है:

Exception in thread "main" java.lang.NumberFormatException: For input string: "one"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at Scratch.getValidCoordinates(scratch_3.java:21)
at Scratch.main(scratch_3.java:6) 




import java.util.Scanner;

class Scratch {
public static void main(String[] args) {
    getValidCoordinates();
}

public static int[] getValidCoordinates() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter the coordinates: ");
    String[] coordinates = scanner.nextLine().split(" ");

    if (!coordinates[0].matches("(-|\\+)?\\d+") || !coordinates[1].matches("(-|\\+)?\\d+")) {
        System.out.println("You should enter numbers!");
        getValidCoordinates();
    }

    int[] numCoordinates = {Integer.parseInt(coordinates[0]), 
Integer.parseInt(coordinates[1])};

    if (numCoordinates[0] > 3 || numCoordinates[0] < 1 || numCoordinates[1] > 3 || 
numCoordinates[1] < 1) {
        System.out.println("Coordinates should be from 1 to 3!");
        getValidCoordinates();
    }

    return numCoordinates;
 }
}
-2
Kabraxis Luvos 4 सितंबर 2021, 21:38

2 जवाब

सबसे बढ़िया उत्तर

आपका अपवाद तब होता है जब आपका रिकर्सन निष्पादन के मूल प्रवाह पर वापस आ जाता है। या तो आपको रिकर्सन से प्राप्त सरणी वापस करें, या एक अनंत लूप में बदलें और continue रिकर्सिंग के बजाय। पसंद,

public static int[] getValidCoordinates() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter the coordinates: ");
    String[] coordinates = scanner.nextLine().split(" ");

    if (!coordinates[0].matches("(-|\\+)?\\d+")
            || !coordinates[1].matches("(-|\\+)?\\d+")) {
        System.out.println("You should enter numbers!");
        return getValidCoordinates();
    }

    int[] numCoordinates = { Integer.parseInt(coordinates[0]),
            Integer.parseInt(coordinates[1])
    };

    if (numCoordinates[0] > 3 || numCoordinates[0] < 1
            || numCoordinates[1] > 3 || numCoordinates[1] < 1) {
        System.out.println("Coordinates should be from 1 to 3!");
        return getValidCoordinates();
    }

    return numCoordinates;
}

या जैसे अनंत लूप के साथ

public static int[] getValidCoordinates() {
    Scanner scanner = new Scanner(System.in);
    while (true) {
        System.out.println("Enter the coordinates: ");
        String[] coordinates = scanner.nextLine().split(" ");

        if (!coordinates[0].matches("(-|\\+)?\\d+")
                    || !coordinates[1].matches("(-|\\+)?\\d+")) {
            System.out.println("You should enter numbers!");
            continue;
        }

        int[] numCoordinates = { Integer.parseInt(coordinates[0]), 
            Integer.parseInt(coordinates[1])
        };

        if (numCoordinates[0] > 3 || numCoordinates[0] < 1
                    || numCoordinates[1] > 3 || numCoordinates[1] < 1) {
            System.out.println("Coordinates should be from 1 to 3!");
            continue;
        }

        return numCoordinates;
    }
}
0
Elliott Frisch 4 सितंबर 2021, 18:49

आइए अपना कोड डीबग करें! लेकिन मुझे इसे स्यूडोकोड के साथ सरल बनाने दें:

void main() {
  coordinates();
}

int[] coordinates() {
  coordinates = nextLine().split(" ");
  if(!coordinates.matches("(-|\\+)?\\d+")) {
    print("Only numbers are allowed");
    coordinates();
  }

  numberCoordinates = coordinates.toInt();
  if(coordinates.bounds()) {
    print("Out of bounds");
    coordinates();
  }

  return numberCoordinates;
}

चलो इसे "चलाएं":

  • हम प्रवेश कर रहे हैं one two
  • यह विभाजित हो जाता है और अब coordinates = {"one", "two"}
  • लेकिन यह रेगेक्स से मेल नहीं खाता, एक और coordinates() फ़ंक्शन को कॉल करता है
  • हम प्रवेश कर रहे हैं 1 2
  • यह विभाजित और सही ढंग से मेल खाता है
  • लेकिन, हम एक बाहरी coordinates() फ़ंक्शन पर वापस आ रहे हैं और यह जारी है
  • coordinates[0] बाहरी coordinates() फ़ंक्शन में अभी भी one है
  • सत्यापन विफल होने पर भी कार्य रोका नहीं जाता है और आपका Integer.parseInt भी विफल हो जाता है

मैंने आपके लिए एक योजना बनाई है :) यहां छवि विवरण दर्ज करें

इतना ही! while के साथ अपने फ़ंक्शन को फिर से लिखें - जब आपका सत्यापन विफल हो जाता है, तो बस continue कीवर्ड का उपयोग करें और आपका फ़ंक्शन एक नई लाइन का अनुरोध करेगा!

0
Vega TV 4 सितंबर 2021, 19:13